問題
次の例外クラスを確認してください。
class MyException extends RuntimeException {}
class MySubExceptionA extends MyException {}
class MySubExceptionB extends MyException {}
次のコード断片をコンパイル、実行するとどうなりますか。
なお、変数 value には有効な正の整数値が格納されるものとします。
public class Main {
public static void main(String... args) {
try {
if (value % 2 == 0)
throw new MySubExceptionA();
else
throw new MySubExceptionB();
} catch (MySubExceptionA | MySubExceptionB e) {
System.out.print("A ");
} catch (MyException e) {
System.out.print("B ");
} catch (RuntimeException e) {
System.out.print("C ");
} catch (Exception e) {
System.out.print("D ");
} finally {
System.out.print("E ");
}
}
}
選択肢
A)A E が出力される
B)何も出力されない
C)E が出力される
D)コンパイルエラーになる
E)A が出力される
F)B が出力される
G)B E が出力される
解答
A)A E が出力される
B)何も出力されない
C)E が出力される
D)コンパイルエラーになる
E)A が出力される
F)B が出力される
G)B E が出力される
解説
try文内のif文はtrueの場合:MySubExceptionAの例外クラスへスロー、falseの場合:MySubExceptionBの例外クラスへスローするようになっており、catch文にははじめ MySubExceptionA | MySubExceptionB e と記述されています。
trueまたはfalseどちらの結果でも catch (MySubExceptionA | MySubExceptionB e) でキャッチすることとなっているため、Aが出力されます。
その後、finallyは必ず実行されるため、Eが出力されます。
- 条件の評価:
value
には有効な正の整数値が格納されているため、value % 2 == 0
がtrue
であればMySubExceptionA
がスローされ、false
であればMySubExceptionB
がスローされます。
- 例外処理:
- スローされた例外は
catch
ブロックで捕捉されます。 MySubExceptionA
またはMySubExceptionB
がスローされた場合、最初のcatch
ブロックであるcatch (MySubExceptionA | MySubExceptionB e)
が実行され、System.out.print("A ");
により “A ” が出力されます。
- スローされた例外は
- finally ブロック:
finally
ブロックは例外がスローされても、正常に処理が終わっても必ず実行されます。この場合、System.out.print("E ");
が実行されます。
- 出力:
- したがって、最終的な出力は “A E ” になります。
他の選択肢についても考慮すると:
- B)何も出力されない: 不正解です。出力があります。
- C)E が出力される: 不正解です。E の前に A があります。
- D)コンパイルエラーになる: 不正解です。コンパイルエラーは発生しません。
- E)A が出力される: 不正解です。E も出力されます。
- F)B が出力される: 不正解です。B は出力されません。
- G)B E が出力される: 不正解です。B は出力されません。
したがって、正しい選択肢は A)A E が出力される です。
対象資格:Java SE17 認定資格