ティム・Z:
数日前、私はJavaは、以下のことが起こることができますどのようにか、なぜ上の任意のドキュメントを見つけることができなかったことを魅力的なシナリオに走りました。(このコードは、バグの単なる簡略化した形です。)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
上記のスニペットで:
BOOL = trueの場合は、値「5」を取得します。
ブール値がfalse IF =三項演算を評価しようとするときには、あなたはヌルポインタ例外を取得します。NOT print文。
この私だけ変更「結果」を修正するには
Long result = bool ? Long.valueOf(intVal) : longVal;
これをやって、私が必要と期待される動作を提供します:
BOOL = trueの場合は、値「5」を取得します。
ブール= falseの場合は、あなたは「ヌル」を取得します
今楽しい部分は、あなたが通常のif / else文にこれを分割する場合、Javaはコンパイルできませんということです
longVal = intVal;
それは、キャッチをdoesntの三項演算子を経由しています。だから何のJavaは、元のスニペットを指しNULLにするためにやっていますか?
(javaの11)
ディエゴ・マグダレノ:
あなたはこれを行うと:
Long result = bool ? intVal : longVal
この式は戻っているlong
とき、そしてbool
それがunboxeしようとする偽でnull
収まるように長い値にresult
変数をし、NPEをスローします。
あなたはこれを行うと:
Long result = bool ? Long.valueOf(intVal) : longVal
この式はすでに戻っているLong
アンボクシングとのための必要はありませんその後、null
値が正常に割り当てられているresult
変数が。
参照:
これが起こるん理由をよりよく理解するために、コメント欄で述べたように、JLSの次のセクションを確認してください。
- セクション5.6.2:二項数値昇格
- セクション15.25:条件演算子?: