奇数Javaの三項行動値を割り当てます。Javaはこれを実現するために舞台裏で何をしているのですか?

ティム・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の次のセクションを確認してください。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=4826&siteId=1