catch の中で例外を投げる
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
try {
throw new RuntimeException("1");
} catch (RuntimeException e) {
System.out.print("C");
throw new IllegalStateException("2");
} finally {
System.out.print("F");
}
}
}
- A
CFと出力された後、例外が発生する - B
Cと出力された後、例外が発生する - C
CFと出力されて正常に終わる - D コンパイルエラーになる
正解と解説を見る
正解: A
- A: catch で C を出力して新しい例外を投げても finally は実行されるので F も出力され、その後 IllegalStateException で止まります。
- B: catch の中で例外を投げても finally は実行されるので、F も出力されます。
- C: catch で投げた IllegalStateException は誰も捕まえないので、正常には終わりません。
- D: IllegalStateException は非チェック例外なので、throws なしで投げられます。
ポイント
- catch の中で投げた例外は、同じ try 文のほかの catch では捕まえられません。finally を実行してから呼び出し元に伝わります。