Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
try-with-resources / AutoCloseable
ファイルやネットワーク接続などのリソースを自動的にクローズする構文です。『try』の括弧内でリソースを宣言すると、ブロックを抜ける際に自動的に『close()』が呼び出されます(Java 7以降)。
構文
// リソースを自動クローズします(Java 7以降)。
try (ResourceType res = new ResourceType()) {
// resを使った処理
} catch (Exception e) {
// 例外処理
}
// 複数のリソースをセミコロン区切りで宣言できます。
try (
ResourceType1 res1 = new ResourceType1();
ResourceType2 res2 = new ResourceType2()
) {
// 処理
}
// AutoCloseableを実装した独自クラスを定義します。
class MyResource implements AutoCloseable {
@Override
public void close() {
System.out.println("リソースをクローズしました。");
}
}
主なインターフェース・クラス一覧
| インターフェース / クラス | 概要 |
|---|---|
| AutoCloseable | close() メソッドを持つインターフェースです。try-with-resources で使用するリソースはこれを実装します。 |
| Closeable | java.io パッケージのインターフェースです。AutoCloseable を継承しており、IOException をスローします。 |
| BufferedReader | Closeable を実装したファイル読み取りクラスです。 |
| FileInputStream | Closeable を実装したバイトストリームクラスです。 |
| Connection(java.sql) | DB接続クラスです。AutoCloseable を実装しています。 |
サンプルコード
import java.io.*;
// try-with-resources でファイルを安全に読み込みます。
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("ファイルの読み込みに失敗しました: " + e.getMessage());
}
// ブロックを抜けると br.close() が自動的に呼ばれます。
// 複数リソースを同時に扱います。
try (
FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")
) {
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
} catch (IOException e) {
System.out.println("エラー: " + e.getMessage());
}
// 独自クラスで AutoCloseable を実装します。
class Connection implements AutoCloseable {
public Connection() { System.out.println("接続しました。"); }
@Override
public void close() { System.out.println("接続を切断しました。"); }
}
try (Connection conn = new Connection()) {
System.out.println("データを処理中…");
}
// 出力:
// 『接続しました。』
// 『データを処理中…』
// 『接続を切断しました。』
概要
try-with-resources 以前は finally ブロックで明示的に close() を呼び出す必要がありましたが、この構文を使うことでクローズ処理の書き忘れを防ぎ、コードを簡潔にできます。複数のリソースを宣言した場合、宣言した順とは逆順でクローズされます。
try-with-resources を使うには、リソースクラスが AutoCloseable(または Closeable)を実装している必要があります。close() 内で例外が発生した場合、try ブロックの例外と合わせて「抑制された例外」として記録されます。e.getSuppressed() で取得できます。
例外処理の基本的な構文については『try / catch / finally / throw』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。