DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

10章5

このJavaのコードを見ると、main メソッドから test メソッドが null を引数にして呼び出されています。test メソッドでは、受け取ったオブジェクトの toString メソッドを呼び出し、結果をコンソールに出力しようとしています。

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

  1. test(null)main メソッドから呼び出される。
  2. test メソッドの try ブロック内で、obj.toString() が呼び出される。objnull なので、NullPointerException がスローされる。
  3. catch ブロックが実行され、「A」がリターンされる前に、コンソールに出力される(しかし、まだリターンはされない)。
  4. finally ブロックが実行され、「B」がコンソールに出力される。
  5. そして、catch ブロックのリターン文が実行され、「A」が main メソッドに返される。
  6. main メソッドは、test メソッドから返された値を受け取り、コンソールに出力する。

結果的にコンソールには次のような出力がされます:

  • 「B」が finally ブロックから出力される。
  • 「A」が main メソッドによって出力される。

したがって、答えは「[B] [A] と表示される」、すなわち選択肢 C になります。

では、コードにコメントを付け加えて説明しましょう。

public class Main {
    public static void main(String[] args) {
        // mainメソッドからtestメソッドを呼び出し、その返り値を出力します。
        // testメソッドにはnullが渡されます。
        System.out.println(test(null));
    }

    // testメソッドはObject型の引数を受け取ります。
    private static String test(Object obj) {
        try {
            // ここでobj.toString()を呼び出していますが、objがnullなので
            // NullPointerExceptionが発生します。
            System.out.println(obj.toString());
        } catch (NullPointerException e) {
            // 例外が捕捉されたら、"A"をリターンする前に
            // ここで"A"をリターンする意図を示しますが、実際にはまだリターンしません。
            return "A";
        } finally {
            // finallyブロックは例外があってもなくても実行されます。
            // ここで"B"を出力します。
            System.out.println("B");
        }
        // tryブロックが正常に終了した場合はここで"C"をリターンしますが、
        // 今回はcatchブロックから"A"がリターンされます。
        // このリターン文は実行されません。
        return "C";
    }
}
Enter fullscreen mode Exit fullscreen mode

プログラムの実行フローは次のとおりです:

  1. main メソッドが test メソッドを null を引数にして呼び出します。
  2. test メソッド内で obj.toString() が呼び出されると NullPointerException がスローされます。
  3. catch ブロックが例外を捕捉し、"A" を返すことを示しますが、実際には finally ブロックが実行されるまでは返されません。
  4. finally ブロックが実行され、「B」がコンソールに出力されます。
  5. finally ブロックが終了すると、catch ブロックからのリターンが実際に行われ、"A" が main メソッドに返されます。
  6. main メソッドは "A" を受け取り、これをコンソールに出力します。

結果としてコンソール上には「B」が先に出力され、「A」が後に出力されます。

Top comments (0)