close がチェック例外を投げる
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
try (Res r = new Res()) {
System.out.println("use");
}
}
}
class Res implements AutoCloseable {
public void close() throws Exception {
System.out.println("close");
}
}
- A
useとcloseが出力される - B
useだけ出力される - C 実行時に例外が発生する
- D コンパイルエラーになる
正解と解説を見る
正解: D
- A: close() が throws Exception なので、処理しないとコンパイルエラーです。実行まで進まないので、何も出力されません。
- B: 実行まで進まないので、何も出力されません。
- C: コンパイルの時点でエラーになるので、実行時の例外にはなりません。
- D: close() はチェック例外の Exception を投げる宣言なので、try-with-resources で暗黙に呼ぶ close() の例外を catch か throws で処理する必要があります。
ポイント
- close が
throws Exceptionと宣言しているので、自動で呼ばれる close の例外を処理しなければなりません。 - catch (Exception e) を付けるか、main に throws Exception を付けるとコンパイルできます。
「try-with-resources 文による例外処理」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)