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 の違い

インタフェース主な用途特徴実装例
AutoCloseableTWR構文の基本close() で任意の例外をスロー可能JDBC Connection, 自作クラス
CloseableIO向け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 試験で高確率で出題されます。