try-with-resources: 自動リソース解放
close() を自動で呼ぶ。リソース漏れ防止。
AutoCloseable
close() を持つインターフェース。
Suppressed
同時発生した例外。
リソース
ファイル、接続など要解放。
try-with-resources
// try-with-resources (Java 7+)
// AutoCloseable を実装したリソースを自動で閉じるtry (FileReader reader = new FileReader("file.txt"); BufferedReader br = new BufferedReader(reader)) {
String line; while ((line = br.readLine()) != null) { System.out.println(line); }
} // 自動で close() が呼ばれる// catch は省略可能
// 複数リソースはセミコロンで区切る// 宣言の逆順で close される効果
// before: 10行の冠長な finally\n// after: 2行で自動 close
Bad
// ❌ Bad: 手動で closeFileReader reader = null;try { reader = new FileReader("file.txt"); // ...} finally { if (reader != null) { try { reader.close(); // 冗長 } catch (IOException e) { } }}Good
// ✅ Good: try-with-resourcestry (FileReader reader = new FileReader("f")) { // ...} // 自動で closeパターン
// カスタム AutoCloseablepublic class Connection implements AutoCloseable { public void open() { System.out.println("Connected"); }
@Override public void close() { System.out.println("Disconnected"); }}
try (Connection conn = new Connection()) { conn.open();} // close() 自動呼び出し
// 既存変数も使える (Java 9+)FileReader reader = new FileReader("file.txt");try (reader) { // ...}
// Suppressed Exceptions// try ブロックと close() の両方で例外が発生した場合// close() の例外は suppressed として格納されるtry { // ...} catch (Exception e) { for (Throwable t : e.getSuppressed()) { System.out.println("Suppressed: " + t); }} Tip: ファイル、DB接続には常に使う。
合格ライン
try-with-resources を使える
AutoCloseable を実装できる
参考リンク
演習課題
課題1: try-with-resources
ファイル読み込みで try-with-resources を使ってください。
課題2: AutoCloseable
AutoCloseable を実装するカスタムリソースを作成してください。