ホームページ > Java > &#&チュートリアル > if ステートメントでは許可されないのに、三項演算子では int の Null 戻り値が許可されるのはなぜですか?

if ステートメントでは許可されないのに、三項演算子では int の Null 戻り値が許可されるのはなぜですか?

Susan Sarandon
リリース: 2024-11-05 01:09:01
オリジナル
377 人が閲覧しました

Why Does the Ternary Operator Allow Null Return for int While an if Statement Doesn't?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート