三項演算子と int の Null を返す if ステートメントの比較
Java では、三項演算子 (?:) を使用して次の代入が可能です。 int は null 値をサポートしないプリミティブ データ型であっても、int 型の変数に null を返します。次のコード スニペットを考えてみましょう。
int temp() {
return true ? null : 0;
}
このコードでは、評価条件が true の場合、三項演算子は変数 temp に null を割り当て、それ以外の場合は 0 を割り当てます。コンパイラは、エラーを発行せずにこの割り当てを許可します。ただし、メソッドが実行されると、null は int の有効な値ではないため、実行時に NullPointerException がスローされます。
三項演算子とは対照的に、if ステートメントでは、次の変数へのこのような null 代入は許可されません。プリミティブ型。例:
int same() {
if (true) {
return null;
} else {
return 0;
}
}
このコードは、「互換性のない型: null を int に変換できません。」というメッセージを含むコンパイル時エラーを生成します。この矛盾の理由は、コンパイラによる値 null の処理方法にあります。
三項演算子の場合、コンパイラは、null リテラルを、int のラッパー クラスである Integer への null 参照として解釈します。これは、オートボックス化およびボックス化解除のコンパイラ ルールによるものです。プリミティブ型からオブジェクト型に変換するとき、Java 仮想マシン (JVM) は、対応するオブジェクト ラッパーでプリミティブ値を自動的にラップします。
int はプリミティブ型の場合、コンパイラは三項演算子によって返された null 値をボックス化解除しようとします。その結果、NullPointerException が発生します。
一方、if ステートメントはこのボックス化解除プロセスを実行せず、null リテラルはそのまま残ります。オブジェクトへの null 参照として。 Same() メソッドの戻り値の型は int であるため、コンパイラは null 参照を int に変換できず、コンパイル時エラーが発生します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3