catch の順番
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
try {
int x = 1 / 0;
} catch (Exception e) {
System.out.println("E");
} catch (ArithmeticException e) {
System.out.println("A");
}
}
}
- A
Eと出力される - B
Aと出力される - C 実行時に例外が発生する
- D コンパイルエラーになる
正解と解説を見る
正解: D
- A: 子の例外の catch を親の後に書くと到達できないので、コンパイルエラーです。実行まで進まないので、何も出力されません。
- B: 実行まで進まないので、何も出力されません。
- C: コンパイルの時点でエラーになるので、実行時の例外にはなりません。
- D: ArithmeticException は Exception の子なので、先の catch (Exception e) ですべて捕まります。後ろの catch に到達できずコンパイルエラーです。
ポイント
- catch は上から順に調べられます。先に Exception を書くと、ArithmeticException の catch には決して届かないのでコンパイルエラーです。
- サブクラスの catch を先に書きます。