web-dev-qa-db-ja.com

Java三項(即時の場合)評価

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

したがって、次のようにNullPointerExceptionがスローされる可能性があります

Integer test = null;

test != null ? test.intValue() : 0;
26
Mike Pone

仕様が必要だったので、ここにあります( §15.25条件演算子?: 、セクションの最後の文から):

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

54
Michael Myers

私はそれが古い投稿であることを知っていますが、非常によく似たケースを見て、私に投票してください: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番目のオペランドの一方がboolean型で、もう一方の型がBoolean型の場合、条件式の型はbooleanです。」

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

宜しくお願いします!

16

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

Integer test = null;
if ( test != null ) { 
    test = test.intValue();
}
else {
    test = 0;
}
9
stevedbrown