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)求值的主要内容,如果未能解决你的问题,请参考以下文章