ホームページ >Java >&#&チュートリアル >Null を返すと三項演算子では NullPointerException が発生するのに、If ステートメントではコンパイル時エラーが発生するのはなぜですか?

Null を返すと三項演算子では NullPointerException が発生するのに、If ステートメントではコンパイル時エラーが発生するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-05 07:30:021009ブラウズ

Why Does a Null Return Cause a NullPointerException in a Ternary Operator but a Compile-Time Error in an If Statement?

三項演算子と if ステートメントでの Null 戻り値

次の Java コード スニペットを考えてみましょう。

<code class="java">public class Main {

    private int temp() {
        return true ? null : 0;
    }

    private int same() {
        if (true) {
            return null;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        Main m = new Main();
        System.out.println(m.temp());
        System.out.println(m.same());
    }
}</code>

In temp() メソッド、三項演算子 true ? null : 0 は true かどうかをチェックし、null を返します。それ以外の場合は 0 を返します。メソッドの戻り値の型が int であるにもかかわらず、コンパイラは null を返すことを許可します。ただし、コードを実行すると、NullPointerException がスローされます。

same() メソッドで、if ステートメントは true の場合に null を返そうとしますが、コンパイラは互換性のない戻り値が原因でコンパイル時エラーを報告します。

違いは何ですか?

主な違いは、コンパイラが null を解釈する方法です。三項演算子とif文で。三項演算子では、null は Integer オブジェクトへの null 参照として扱われます。オートボックス化およびボックス化解除のルール (Java 言語仕様、15.25) では、null はボックス化解除によって自動的に int に変換され、その結果、int が使用されると NullPointerException が発生します。

対照的に、if ステートメントは明示的に式の真偽は true であり、宣言された int の戻り値の型と互換性のない null を返そうとします。したがって、コンパイラは、不正なコードの実行を防ぐためにコンパイル時エラーを生成します。

以上がNull を返すと三項演算子では NullPointerException が発生するのに、If ステートメントではコンパイル時エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。