Java Gold SE11対策:もう怖くない!Java I/Oの例外処理とtry-with-resources完全ガイド

Java Gold SE11 試験では、例外処理と try-with-resources(TWR)構文についても頻出の論点です。とくに AutoCloseable を実装したリソースの自動クローズ処理や、catch 節と finally 節の実行順序に関する理解が問われます。
この記事では、TWR構文の書き方・例外処理との組み合わせ、AutoCloseable と Closeable の違い、試験で出やすい落とし穴を整理して解説します。
目次
try-with-resources 構文の基本
Java 7 以降では、try(…) {} という構文で、自動的に close() を呼び出すリソース管理が可能です。
try (FileInputStream fis = new FileInputStream(“data.txt”)) {
// リソース使用
} catch (IOException e) {
e.printStackTrace();
}
// fis は自動的に close() される
- try(…) の括弧内に書かれる「リソース」は、AutoCloseable インタフェースを実装している必要があります。
- try-with-resources により、例外が発生しても確実にリソースが解放されます。
Closeable と AutoCloseable の違い
インタフェース | 主な用途 | 特徴 | 実装例 |
AutoCloseable | TWR構文の基本 | close() で任意の例外をスロー可能 | JDBC Connection, 自作クラス |
Closeable | IO向け | IOException をスローする close() を持つ | InputStream, Reader, FileInputStream など |
- Closeable は AutoCloseable のサブインタフェースなので、どちらを実装していても try-with-resources で使用可能です。
- close() メソッドがあっても、インタフェースを実装していないと TWRでは使えません!
試験で問われやすいポイント:
class MyResource {
public void close() {
System.out.println(“closed”);
}
}
try (MyResource res = new MyResource()) {
// …
}
⛔ このコードは コンパイルエラー!
→ MyResource は AutoCloseable を実装していないから。
✅ 正しい書き方:
class MyResource implements AutoCloseable {
public void close() {
System.out.println(“closed”);
}
}
catch / finally の動作確認
try {
throw new RuntimeException(“例外発生”);
} catch (Exception e) {
System.out.println(“catch”);
} finally {
System.out.println(“finally”);
}
実行結果:
catch
finally
- catch で例外を捕捉しても、finally は 必ず実行 される。
- catch がなければ finally の後に例外がスローされる。
複数の例外を扱う場合
try {
// 例外が出る処理
} catch (IOException | SQLException e) {
e.printStackTrace();
}
- マルチキャッチでは、すべての例外型が 共通のスーパークラスにキャスト可能 である必要がある(例:Exception)。
- e は final と見なされるため、再代入は不可。
suppressed例外とは?
try-with-resources では、try ブロック内で例外が発生 → close() 中でも例外が発生した場合、close() 側の例外は suppressed(抑制) されます。
try (MyResource res = new MyResource()) {
throw new RuntimeException(“Main Error”);
} catch (Exception e) {
System.out.println(e.getMessage()); // “Main Error”
for (Throwable t : e.getSuppressed()) {
System.out.println(“Suppressed: ” + t);
}
}
試験では Throwable.getSuppressed() を使った例外確認が出題されることもあります。
リソースの複数宣言
try (
BufferedReader br = new BufferedReader(new FileReader(“input.txt”));
FileWriter fw = new FileWriter(“output.txt”)
) {
// 複数リソースOK
}
- セミコロン ; で区切って複数のリソースを宣言できます。
- クローズは 宣言の逆順 に呼ばれます(後ろから順に)。
試験で問われる注意点まとめ
試験パターン | ポイント |
自作クラスをTWRに使う | AutoCloseable 実装が必要。close() だけではNG。 |
Closeable vs AutoCloseable | 両方使えるが、後者はより汎用的。 |
finally は常に実行? | Yes。try, catch の有無にかかわらず実行される。 |
マルチキャッチ | 共通の親クラスでキャッチ。再代入不可。 |
suppressed例外の理解 | close() 側の例外は getSuppressed() で取得可能。 |
リソースの逆順クローズ | 宣言順に開き、逆順で閉じる。 |
おわりに
今回は、Java I/O 処理における try-with-resources 構文と例外処理の基本についてまとめました。特に、リソース指定における AutoCloseable の実装要件や、finally の実行順序、suppressed 例外などは、Java Gold SE11 試験で高確率で出題されます。