三項演算子と 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 サイトの他の関連記事を参照してください。