33

これに答える仕様の関連部分が見つかりません。Java の条件演算子ステートメントでは、true と false の両方の引数が評価されますか?

したがって、次は NullPointerException をスローできますか

Integer test = null;

test != null ? test.intValue() : 0;
4

3 に答える 3

61

あなたは仕様が欲しかったので、ここにあります(§15.25 Conditional Operator ? :、セクションの最後の文から):

選択されていないオペランド式は、条件式の特定の評価では評価されません。

于 2009-06-10T21:55:02.430 に答える
24

私はそれが古い投稿であることを知っていますが、非常によく似たケースを見て、私に投票してください:P

元の質問への回答:1つのオペランドのみが評価されますが、次のようになります。

@Test
public void test()
{
    Integer A = null;
    Integer B = null;

    Integer chosenInteger = A != null ? A.intValue() : B;    
}

このテストはNullPointerException常にスローされます。この場合、IF statematは?:演算子と同等ではありません。

その理由はここにありますhttp://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25。ボクシング/アンボクシングに関する部分は巻き込まれていますが、以下を見ると簡単に理解できます。

「2番目と3番目のオペランドの1つがboolean型で、もう1つの型Booleanが型である場合、条件式の型はですboolean。」

同じことが当てはまりますInteger.intValue()

よろしくお願いします!

于 2013-02-26T06:44:09.120 に答える
9

いいえ、できませんでした。それは次と同じです:

Integer test = null;
if ( test != null ) { 
    test = test.intValue();
}
else {
    test = 0;
}
于 2009-06-10T21:49:28.897 に答える