DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

10章4

このJavaのコードは、try-catch-finallyブロックを使って例外処理を行っています。ここで、コメントアウトを加えてコードの流れを説明します。

public class Main {
    public static void main(String[] args) {
        try {
            // ここではnullを参照しているオブジェクトを使ってtoStringメソッドを呼び出しているため、
            // NullPointerExceptionが発生します。
            Object obj = null;
            System.out.println(obj.toString());
            // この行はNullPointerExceptionが発生するため実行されません。
            System.out.println("A");
        } finally {
            // finallyブロックは、例外が発生しても、しなくても必ず実行されるブロックです。
            // そのため、"B"がコンソールに出力されます。
            System.out.println("B");
        } // catchブロックはfinallyブロックの後に来るため、ここは構文エラーです。
          // 正しくは、catchブロックがfinallyブロックよりも前に来る必要があります。
        catch (NullPointerException e) {
            // ここでNullPointerExceptionを捕捉して、"C"をコンソールに出力します。
            System.out.println("C");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

このコードは実際には構文エラーを引き起こします。なぜなら、finallyブロックがcatchブロックの前に記述されているためです。Javaではtryの後に直接finallyを書くことはできますが、その場合はcatchブロックを省略する必要があります。catchを使用する場合、tryの直後に書かなければなりません。

ただし、質問文にある答えとしての「D」とは、「コンパイルエラーが発生する」という意味です。これは、先述の通り、finallyブロックがcatchブロックの前に来ているため正しいです。Javaの文法では、tryブロックの直後にcatchブロックが来なければならず、その後にfinallyブロックを置く必要があります。ですので、コードの順番を次のように修正する必要があります。

修正後のコード:

public class Main {
    public static void main(String[] args) {
        try {
            Object obj = null;
            System.out.println(obj.toString());
            System.out.println("A");
        } catch (NullPointerException e) {
            System.out.println("C");
        } finally {
            System.out.println("B");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

この修正を行った後のコードでは、「C」が例外発生時に出力され、「B」はfinallyブロックによって必ず出力されることになります。「A」は例外が発生するため出力されません。ですが、与えられたコードは修正前のものであり、このままではコンパイルエラーが発生するため、「D」が正しい答えとなります。

Top comments (0)