Java三元(即时)评估

Mik*_*one 27 java conditional-operator short-circuiting

我无法找到规范的相关部分来回答这个问题.在Java中的条件运算符语句中,是否评估了true和false参数?

因此,以下内容可能会抛出NullPointerException

Integer test = null;

test != null ? test.intValue() : 0;
Run Code Online (Sandbox Code Playgroud)

Mic*_*ers 55

既然你想要规范,这里是(来自§15.25条件运算符?:,该节的最后一句):

未针对条件表达式的特定评估评估未选择的操作数表达式.


Mic*_*zek 17

我知道这是老帖子,但看看非常相似的情况,然后投票给我:P

回答原始问题:只评估一个操作数但是:

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

    Integer chosenInteger = A != null ? A.intValue() : B;    
}
Run Code Online (Sandbox Code Playgroud)

此测试将NullPointerException始终抛出,在这种情况下,IF statemat不等同于?:operator.

原因在于http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25.关于装箱/拆箱的部分是卷入其中的,但是可以很容易地理解:

"如果第二个和第三个操作数之一是类型boolean而另一个操作数的类型是类型Boolean,那么条件表达式的类型就是boolean."

这同样适用于 Integer.intValue()

最好的祝福!

  • 有意思的是,谢谢Michal.因为A.intValue()的类型为int,所以对B的引用必须是自动取消装箱的.但它是空的,所以它抛出了NPE.在Java 8/Eclipse Luna中打开了null分析,这个测试甚至都没有编译! (2认同)

ste*_*own 9

不,它不能.这与以下相同:

Integer test = null;
if ( test != null ) { 
    test = test.intValue();
}
else {
    test = 0;
}
Run Code Online (Sandbox Code Playgroud)