English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、try-with-resources文脈は、自動的にリソースを閉じます。
try-with-resources文脈は、文末で自動的にすべてのリソースを閉じます。リソースはプログラム終了時に閉じる必要があるオブジェクトです。
その文法は以下の通りです:
try (resource declaration) { // リソースの使用 } catch (ExceptionType e1) { // catch block }
上記の文法から、以下のようにtryを宣言することができます。-with-resources文脈:
try子句内でリソースを宣言し、インスタンス化します。
リソースを閉じる際に発生する可能性のあるすべての例外を指定し、処理する必要があります。
注意:try-with-resources文脈は、AutoCloseableインターフェースを実装したすべてのリソースを自動的に閉じます。
try文の実現に取り組んでみましょう。-with-resources文脈の例として。
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("tryブロック内のIOException =>" + e.getMessage()); } } }
test.txtファイルが見つからない場合、出力します。
try中のIOException-with-resources block =>test.txt (ファイルまたはディレクトリが見つかりません)
test.txtファイルが見つかった場合、出力します。
tryに入ります。-with-resources block Line =>test line
この例では、test.txtファイルからデータを読み取るために使用するインスタンスBufferedReaderが指定されています。
try-with-resources文脈で宣言し、インスタンス化されたBufferedReaderは、try文が正常に終了するかどうかにかかわらず、そのインスタンスを閉じることができます。
例外が発生した場合、例外処理ブロックを使用して、または}}throws キーワードを処理します。
上記の例では、以下の状況でtry-with-resources ステートメントが例外をスロー:
test.txt ファイルが見つかりません。
BufferedReader オブジェクトを閉じます。
からも例外を発生させることができます、ファイルの読み取りはさまざまな理由で失敗する可能性があります。
からtry-with-resources ステートメントがすべて例外をスローした場合、try ブロック内の例外がスローされ、try-with-resources ステートメントの例外
Java 7および更高版本中、try ブロックから発生した例外からThrowable.getSuppressed()メソッドを呼び出して抑制された例外を取得できます。
このメソッドはすべての抑制された例外の配列を返します。catch ブロックで抑制された例外を受け取ります。
catch(IOException e) { System.out.println("投げられた例外=>" + e.getMessage()); Throwable[] suppressedExceptions = e.getSuppressed(); for (int i = 0; i < suppressedExceptions.length; i++) { System.out.println("抑制された例外=>" + suppressedExceptions[i]); } }
これはtry-with-resourcesの利点:
Java 7この機能を導入する前に、リソースの漏洩を避けるためにfinally ブロックを使用してリソースを閉じる必要があります。
これは、以下に似たサンプル1のプログラム。ただし、このプログラムでは、finally ブロックを使用してリソースを閉じます。
import java.io.*; class Main { public static void main(String[] args) { BufferedReader br = null; String line; try { System.out.println("进入try ブロック"); br = new BufferedReader(new FileReader("test.txt")); while ((line = br.readLine()) != null) { System.out.println("Line =>")+line); } } catch (IOException e) { System.out.println("tryブロック内のIOException =>" + e.getMessage()); } finally { System.out.println("finallyブロックに入ります"); try { if (br != null) { br.close(); } } catch (IOException e) { System.out.println("finallyブロック内のIOException =>"+e.getMessage()); } } } }
出力結果
tryブロックに入ります Line =>test.txtファイルからline finallyブロックに入ります
上の例から分かるように、finallyブロックを使用してリソースをクリーンアップすることで、コードがより複雑になります。
finallyブロック内のBufferedReaderインスタンスを閉じる際にIOExceptionが発生する可能性があることに気づきましたか?そのため、それもキャッチして処理する必要があります。
try-with-resources文の実行自動リソース管理。リソースを明示的に閉じる必要はありません。なぜなら、JVMが自動的にそれらを閉じるからです。これにより、コードが読みやすくなり、書きやすくなります。
私たちはtry-with-resourcesは、複数のリソースを区切るためにセミコロンを使用して、文の中で複数のリソースを宣言します;
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 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 ステートメントを使用して、ローカルでリソース参照が宣言されていない場合でも使用できます。現在のコードは、コンパイルエラーを投げずに実行されます。