Java 三元(立即 if)求值

Posted

技术标签:

【中文标题】Java 三元(立即 if)求值【英文标题】:Java ternary (immediate if) evaluation 【发布时间】:2010-11-01 23:24:20 【问题描述】:

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

以下是否会抛出 NullPointerException

Integer test = null;

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

【问题讨论】:

这也很简单,你可以试试看会发生什么:) 它为您提供有关一个特定实例的信息。最好找到标准所说的内容。 【参考方案1】:

既然你想要规范,这里就是(来自§15.25 Conditional Operator ? :,该部分的最后一句):

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

【讨论】:

【参考方案2】:

我知道这是旧帖子,但看看非常相似的案例然后投票给我:P

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

@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。关于装箱/拆箱的部分被卷入其中,但看起来很容易理解:

“如果第二个和第三个操作数之一的类型为boolean,另一个的类型为Boolean,则条件表达式的类型为boolean。”

同样适用于Integer.intValue()

最好的问候!

【讨论】:

有趣的一点,谢谢 Michal。因为 A.intValue() 是 int 类型,所以对 B 的引用必须自动取消装箱。但它是空的,所以它会抛出 NPE。在 Java 8/Eclipse Luna 中打开了 null 分析,这个测试甚至无法编译!【参考方案3】:

不,它不能。就是这样:

Integer test = null;
if ( test != null )  
    test = test.intValue();

else 
    test = 0;

【讨论】:

以上是关于Java 三元(立即 if)求值的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符求值顺序

php三元运算符?:和??

Aviator表达式求值引擎

三元运算符

Java 表达式中子表达式的求值顺序

if 括号 if(...) 中语句的求值顺序是啥? [复制]