このJavaのコードは入れ子になったtry
ブロックを使用しています。外側のtry
ブロックには、さらに内側のtry
ブロックがあります。内側のtry
ブロックは配列の範囲外アクセスを試み、その結果、ArrayIndexOutOfBoundsException
を投げることになります。それをキャッチして、"D"を出力し、その後にfinally
ブロックが実行されて"E"を出力します。外側のtry
ブロックには例外は投げられませんが、そのfinally
ブロックは必ず実行され、"G"を出力します。
以下はコードにコメントを加えたものです:
public class Main {
public static void main(String[] args) {
try {
// 外側のtryブロック開始
try {
// 内側のtryブロック開始
String[] array = {"A", "B", "C"};
System.out.println(array[3]); // 配列の範囲外アクセスにより例外が発生
} catch (ArrayIndexOutOfBoundsException e) {
// 配列の範囲外アクセス例外をキャッチ
System.out.println("D"); // "D"を出力
} finally {
// 内側のtryブロックのfinally。例外があろうとなかろうと実行される
System.out.println("E"); // "E"を出力
}
// ここでは例外は投げられないため、catchブロックはスキップされる
} catch (ArrayIndexOutOfBoundsException e) {
// このブロックは実行されない
System.out.println("F");
} finally {
// 外側のtryブロックのfinally。例外があろうとなかろうと実行される
System.out.println("G"); // "G"を出力
}
}
}
コードの実行フローは以下のようになります:
- 内側の
try
ブロックが開始されます。 -
array[3]
へのアクセスが範囲外であるため、ArrayIndexOutOfBoundsException
が発生します。 - 内側の
catch
ブロックがこの例外をキャッチし、"D"を出力します。 - 内側の
finally
ブロックが実行され、"E"を出力します。 - 外側の
try
ブロックには例外が伝播しないので、外側のcatch
ブロックは実行されません。 - 外側の
finally
ブロックが実行され、"G"を出力します。
したがって、実行される出力は "D"、"E"、"G" であり、答えはBとなります。
Top comments (0)