数日前、私は、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」になります。
しかし、bool = falseの場合、3項演算を評価しようとすると、nullポインタ例外が発生します。印刷ステートメントではありません。
これを修正するには、「結果」を次のように変更します
Long result = bool ? Long.valueOf(intVal) : longVal;
これを行うと、私が必要とする期待される動作が得られます:
bool = trueの場合、値は「5」になります。
しかし、bool = falseの場合、「null」になります。
楽しい部分は、これを通常のif / elseステートメントに分割した場合、Javaではコンパイルできないことです。
longVal = intVal;
しかし、三項演算子を介してそれをキャッチしません。それで、元のスニペットでそれをヌルポイントにするためにJavaは何をしていますか?
(Java 11)