Java三目运算符(即时if)求值

35

我找不到规范中相关的部分来回答这个问题。在 Java 中的条件运算符语句中,真值和假值的参数都会被计算吗?

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

Integer test = null;

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

6
这也是一件简单到你可以尝试并看看结果的东西 :) - Rob Hruska
13
这可以为您提供关于某个特定情况的信息。最好查找标准规定的内容。 - David Thornley
3个回答

63

既然你需要规范,那么这里就是它了(引自§15.25 条件运算符 ? :,该部分的最后一句话):

在特定条件下的求值中,未被选择的操作数表达式不会被计算。


24

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

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

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

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

这个测试总是会抛出 NullPointerException,而在这种情况下 IF 语句不等同于 ?: 运算符。
原因在这里 http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25。关于装箱/拆箱的部分很复杂,但是可以通过查看以下内容轻松理解:

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

对于 Integer.intValue() 也适用。
此致!

3
有趣的一点,谢谢Michal。因为A.intValue()是int类型,对B的引用必须自动取消装箱。但它是null,所以会抛出NPE异常。在Java 8 / Eclipse Luna上启用空分析时,此测试甚至无法编译! - Erick G. Hagstrom

8
不行,这与以下内容相同:

不行,这与以下内容相同:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接