Java三元(即时if)评估

Java三元(即时if)评估,java,conditional-operator,short-circuiting,Java,Conditional Operator,Short Circuiting,我找不到规范的相关部分来回答这个问题。 在Java中的条件运算符语句中,是否同时计算true和false参数 那么下面的代码是否会抛出NullPointerException呢 Integer test = null; test != null ? test.intValue() : 0; 不,不可能。这与: Integer test = null; if ( test != null ) { test = test.intValue(); } else { test =

我找不到规范的相关部分来回答这个问题。 在Java中的条件运算符语句中,是否同时计算true和false参数

那么下面的代码是否会抛出NullPointerException呢

Integer test = null;

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

不,不可能。这与:

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

既然您想要这个规范,这里就是(来自,本节的最后一句话):

未选择的操作数表达式不会针对条件表达式的特定计算进行计算


我知道这是一篇老文章,但看看非常相似的案例,然后给我投票:p

回答原始问题:只计算一个操作数,但:

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

    Integer chosenInteger = A != null ? A.intValue() : B;    
}
如果statemat不等于?:运算符,此测试将始终抛出
NullPointerException

原因就在这里。有关装箱/拆箱的部分涉及其中,但很容易理解:

如果第二个和第三个操作数中的一个为
布尔型
,另一个为
布尔型
,则条件表达式的类型为
布尔型

这同样适用于
Integer.intValue()


致以最良好的祝愿

它也非常简单,您可以尝试一下,看看会发生什么:)它提供了一个特定实例的信息。最好能找到标准上说的。有趣的一点,谢谢Michal。由于A.intValue()的类型为int,因此对B的引用必须自动取消绑定。但是它是空的,所以它抛出NPE。在启用空分析的Java8/EclipseLuna中,此测试甚至不编译!