ホームページ  >  記事  >  Java  >  try ステートメントを使用してリソース インスタンスを閉じる

try ステートメントを使用してリソース インスタンスを閉じる

PHP中文网
PHP中文网オリジナル
2017-06-21 17:02:011569ブラウズ

Java7 で強化されたリソースを閉じるための try ステートメント

リソースを閉じる従来の方法

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

class Student implements Serializable {
    private String name;

    public Student(String name) {
        this.name = name;
    }
}

public class test2 {
    public static void main(String[] args) throws Exception {
        Student s = new Student("WJY");
        Student s2 = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        try {
            //创建对象输出流
            oos = new ObjectOutputStream(new FileOutputStream("b.bin"));
            //创建对象输入流
            ois = new ObjectInputStream(new FileInputStream("b.bin"));
            //序列化java对象
            oos.writeObject(s);
            oos.flush();
            //反序列化java对象
            s2 = (Student) ois.readObject();
        } finally { //使用finally块回收资源
            if (oos != null) {
                try {
                    oos.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            if (ois != null) {
                try {
                    ois.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}
  • finally ブロックを使用して物理リソースを閉じ、閉じる操作が常に実行されるようにします。

  • 各リソースを閉じる前に、まずリソースを参照する参照変数が null でないことを確認してください。

  • 物理リソースごとに個別の try...catch ブロックを使用してリソースを閉じ、リソースを閉じるときに発生する例外が他のリソースの閉じに影響しないようにします。

    上記の方法では、finally ブロックのコードが非常に肥大化し、プログラムの可読性が低下します。

java7 リソースを閉じるための try ステートメントの強化

上記の従来のメソッドの問題を解決するために、Java7 はリソースを自動的に閉じるための新しい try ステートメントを追加しました。これにより、括弧の後に try キーワードを続けることができ、1 つ以上のリソースを宣言して初期化できます。ここでのリソースとは、プログラムの終了時に明示的に閉じる必要があるリソース (データベース接続、ネットワーク接続など) を指します。 .) の場合、try ステートメントはステートメントの最後でこれらのリソースを自動的に閉じます。

public class test2 {
    public static void main(String[] args) throws Exception {
        Student s = new Student("WJY");
        Student s2 = null;
        try (//创建对象输出流
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.bin"));
                //创建对象输入流
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.bin"));
       )
    {
            //序列化java对象
            oos.writeObject(s);
            oos.flush();
            //反序列化java对象
            s2 = (Student) ois.readObject();
        }

    }
}

リソースを自動的に閉じる try ステートメントは、(リソースを閉じるために使用される) 暗黙的なfinally ブロックを含めることと同等であるため、この try ステートメントには catch ブロックもfinally ブロックも含めることはできません。

注:

  • 自動的に閉じられるリソースは、Closeable または AutoCloseable インターフェースを実装する必要があります。 (Closeable は AutoCloseable のサブインターフェイスです。Closeeable インターフェイスの close() メソッド ステートメントは IOException をスローします。AutoCloseable インターフェイスの close() メソッド ステートメントは Exception をスローします。)

  • クローズされたリソースを配置する必要がありますtry ステートメントの後の括弧内で宣言および初期化されます。プログラムにリソースを自動的に閉じる必要がある try ステートメントがある場合、複数の catch ブロックとfinally ブロックを含めることができます。

Java7 は、ほぼすべての「リソース クラス」(ファイル IO、接続、ステートメント、および JDBC プログラミングのその他のインターフェイスを含む) を書き換えました。書き換えられたリソース クラスはすべて、AutoCloseable または Closeable インターフェイスを実装します。

以上がtry ステートメントを使用してリソース インスタンスを閉じるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。