int の Null を返すための三項演算子と if ステートメント
Java では、三項演算子 (?:) を使用して次の代入が可能です。 int は null 値をサポートしないプリミティブ データ型であっても、int 型の変数に null を返します。次のコード スニペットを考えてみましょう。
<code class="java">int temp() { return true ? null : 0; }</code>
このコードでは、評価条件が true の場合、三項演算子は変数 temp に null を割り当て、それ以外の場合は 0 を割り当てます。コンパイラは、エラーを発行せずにこの割り当てを許可します。ただし、メソッドが実行されると、null は int の有効な値ではないため、実行時に NullPointerException がスローされます。
三項演算子とは対照的に、if ステートメントでは、次の変数へのそのような null 代入は許可されません。プリミティブ型。例:
<code class="java">int same() { if (true) { return null; } else { return 0; } }</code>
このコードは、「互換性のない型: null を int に変換できません。」というメッセージを含むコンパイル時エラーを生成します。この矛盾の理由は、コンパイラによる値 null の処理方法にあります。
三項演算子の場合、コンパイラは、null リテラルを、int のラッパー クラスである Integer への null 参照として解釈します。これは、オートボックス化およびボックス化解除のコンパイラ ルールによるものです。プリミティブ型からオブジェクト型に変換するとき、Java 仮想マシン (JVM) は、対応するオブジェクト ラッパーでプリミティブ値を自動的にラップします。
int はプリミティブ型の場合、コンパイラは三項演算子によって返された null 値をボックス化解除しようとします。その結果、NullPointerException が発生します。
一方、if ステートメントはこのボックス化解除プロセスを実行せず、null リテラルはそのまま残ります。オブジェクトへの null 参照として。 Same() メソッドの戻り値の型は int であるため、コンパイラは null 参照を int に変換できず、コンパイル時エラーが発生します。
以上がif ステートメントでは許可されないのに、三項演算子では int の Null 戻り値が許可されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。