DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

10章9

この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"を出力
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

コードの実行フローは以下のようになります:

  1. 内側のtryブロックが開始されます。
  2. array[3]へのアクセスが範囲外であるため、ArrayIndexOutOfBoundsExceptionが発生します。
  3. 内側のcatchブロックがこの例外をキャッチし、"D"を出力します。
  4. 内側のfinallyブロックが実行され、"E"を出力します。
  5. 外側のtryブロックには例外が伝播しないので、外側のcatchブロックは実行されません。
  6. 外側のfinallyブロックが実行され、"G"を出力します。

したがって、実行される出力は "D"、"E"、"G" であり、答えはBとなります。

Top comments (0)