try-with-resources / AutoCloseable
| 対応: | Java 7(2011) |
|---|
ファイルやネットワーク接続などのリソースを自動的にクローズする構文です。『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 を実装しています。 |
サンプルコード
sample_TryWithResources.java
import java.io.*;
class Connection implements AutoCloseable {
public Connection() { System.out.println("接続しました。"); }
@Override
public void close() { System.out.println("接続を切断しました。"); }
}
class TryWithResources {
public static void main(String[] args) {
// 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());
}
// 複数リソースを同時に扱います
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 を実装します
try (Connection conn = new Connection()) {
System.out.println("データを処理中…");
} catch (Exception e) {
e.printStackTrace();
}
// 出力: 『接続しました。』→ 『データを処理中…』→ 『接続を切断しました。』
}
}
TryWithResources.java
javac TryWithResources.java java TryWithResources ファイルの読み込みに失敗しました: data.txt (No such file or directory) エラー: input.txt (No such file or directory) 接続しました。 データを処理中… 接続を切断しました。
概要
try-with-resources 以前は finally ブロックで明示的に close() を呼び出す必要がありましたが、この構文を使うことでクローズ処理の書き忘れを防ぎ、コードを簡潔にできます。複数のリソースを宣言した場合、宣言した順とは逆順でクローズされます。
try-with-resources を使うには、リソースクラスが AutoCloseable(または Closeable)を実装している必要があります。close() 内で例外が発生した場合、try ブロックの例外と合わせて「抑制された例外」として記録されます。e.getSuppressed() で取得できます。
例外処理の基本的な構文については『try / catch / finally / throw』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。