Java try-with-resources
Java try-with-resources
このチュートリアルでは、リソースを自動的に閉じるための try-with-resources ステートメントについて学習します。
try-with-resources
ステートメントは、ステートメントの最後ですべてのリソースを自動的に閉じます。リソースは、プログラムの最後に閉じられるオブジェクトです。
その構文は次のとおりです:
try (resource declaration) {
// use of the resource
} catch (ExceptionType e1) {
// catch block
}
上記の構文からわかるように、 try-with-resources
を宣言します による声明
try
内でリソースを宣言してインスタンス化する 句。注: try-with-resources ステートメントは、AutoCloseable インターフェースを実装するすべてのリソースを閉じます。
try-with-resources
を実装する例を見てみましょう
例 1:リソースで試す
import java.io.*;
class Main {
public static void main(String[] args) {
String line;
try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
}
}
}
test.txt ファイルが見つからない場合に出力します。
IOException in try-with-resources block =>test.txt (No such file or directory)
test.txt ファイルが見つかった場合に出力します。
Entering try-with-resources block Line =>test line
この例では、BufferedReader のインスタンスを使用します。 test.txt
からデータを読み取る ファイル。
BufferedReader の宣言とインスタンス化 try-with-resources
の中 try
ステートメントは正常に完了するか、例外をスローします。
例外が発生した場合、例外処理ブロックまたは throws キーワードを使用して処理できます。
抑制された例外
上記の例では、try-with-resources
から例外をスローできます。 ステートメント:
- ファイル
test.txt
が見つかりません。 BufferedReader
を閉じる オブジェクト。
try
から例外をスローすることもできます ファイル読み取りとしてのブロックは、さまざまな理由でいつでも失敗する可能性があります。
try
の両方から例外がスローされた場合 ブロックと try-with-resources
ステートメント、try
からの例外 ブロックがスローされ、try-with-resources
から例外が発生します ステートメントは抑制されています。
抑制された例外の取得
Java 7 以降では、抑制された例外は Throwable.getSuppressed()
を呼び出すことで取得できます。 try
によってスローされた例外のメソッド ブロックします。
このメソッドは、抑制されたすべての例外の配列を返します。 catch
で抑制された例外を取得します ブロックします。
catch(IOException e) {
System.out.println("Thrown exception=>" + e.getMessage());
Throwable[] suppressedExceptions = e.getSuppressed();
for (int i=0; i<suppressedExceptions.length; i++) {
System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
}
}
try-with-resources を使用する利点
try-with-resources を使用する利点は次のとおりです。
1.リソースを閉じるために最後にブロックする必要はありません
Java 7 でこの機能が導入される前は、finally
を使用する必要がありました リソース リークを回避するために、リソースが確実に閉じられるようにブロックします。
例 1 に似たプログラムを次に示します。 .ただし、このプログラムでは、finally ブロックを使用してリソースを閉じています。
例 2:finally ブロックを使用してリソースを閉じる
import java.io.*;
class Main {
public static void main(String[] args) {
BufferedReader br = null;
String line;
try {
System.out.println("Entering try block");
br = new BufferedReader(new FileReader("test.txt"));
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
} finally {
System.out.println("Entering finally block");
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.out.println("IOException in finally block =>"+e.getMessage());
}
}
}
}
出力
Entering try block Line =>line from test.txt file Entering finally block
上記の例からわかるように、 finally
の使用 リソースをクリーンアップするためのブロックは、コードをより複雑にします。
try...catch
に注意してください finally
のブロック ブロックも?これは IOException
BufferedReader
を閉じるときにも発生する可能性があります この finally
内のインスタンス ブロックして、それもキャッチして処理します。
try-with-resources
ステートメントは自動リソース管理を行います . JVM がリソースを自動的に閉じるため、リソースを明示的に閉じる必要はありません。これにより、コードが読みやすくなり、書きやすくなります。
2.複数のリソースでリソースを試す
try-with-resources
で複数のリソースを宣言できます セミコロン ;
で区切ってステートメント
例 3:複数のリソースで試す
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException{
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
}
}
}
このプログラムが例外を生成せずに実行された場合、Scanner
オブジェクトは testRead.txt
から行を読み取ります ファイルに書き込んで、新しい testWrite.txt
に書き込みます ファイル。
複数の宣言が行われると、try-with-resources
ステートメントは、これらのリソースを逆の順序で閉じます。この例では、PrintWriter
オブジェクトが最初に閉じられ、次に Scanner
が閉じられます オブジェクトは閉じています。
Java 9 の try-with-resources の機能強化
Java 7 では、try-with-resources
に制限があります。 声明。リソースはそのブロック内でローカルに宣言する必要があります。
try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
// code
}
Java 7 でブロックの外側でリソースを宣言すると、エラー メッセージが生成されます。
Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
// code
}
このエラーに対処するために、Java 9 は try-with-resources
を改善しました。 リソースの参照がローカルで宣言されていなくても使用できるように、ステートメントを使用します。上記のコードは、コンパイル エラーなしで実行されるようになりました。
Java