try-with-resources: 自動リソース解放

close() を自動で呼ぶ。リソース漏れ防止。

AutoCloseable
close() を持つインターフェース。
Suppressed
同時発生した例外。
リソース
ファイル、接続など要解放。
Auto-Return Box

try-with-resourcesは「自動返却ボックス」。 レンタル品(リソース)を使い終わったら自動で返却。 返し忘れ(リーク)を防ぐ。

try-with-resources

Automatic close()
// 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: 手動で close
FileReader reader = null;
try {
reader = new FileReader("file.txt");
// ...
} finally {
if (reader != null) {
try {
reader.close(); // 冗長
} catch (IOException e) { }
}
}
Good
// ✅ Good: try-with-resources
try (FileReader reader = new FileReader("f")) {
// ...
} // 自動で close

パターン

AutoCloseable, Suppressed
// カスタム AutoCloseable
public 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 を実装するカスタムリソースを作成してください。

次のステップ