Java 三元(立即 if)求值

发布于 2024-07-24 21:12:42 字数 198 浏览 6 评论 0原文

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

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

Integer test = null;

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

I can't find the relevant portion of the spec to answer this.
In a conditional operator statement in Java, are both the true and false arguments evaluated?

So could the following throw a NullPointerException

Integer test = null;

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

暮年慕年 2024-07-31 21:12:43

不,不可能。 这与:

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

No, it couldn't. That's the same as:

Integer test = null;
if ( test != null ) { 
    test = test.intValue();
}
else {
    test = 0;
}
白色秋天 2024-07-31 21:12:42

既然您想要规范,那就是(来自 §15.25 条件运算符 ? :,本节最后一句):

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

Since you wanted the spec, here it is (from §15.25 Conditional Operator ? :, the last sentence of the section):

The operand expression not chosen is not evaluated for that particular evaluation of the conditional expression.

爱*していゐ 2024-07-31 21:12:42

我知道这是旧帖子,但看看非常相似的情况,然后投票给我: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类型,则条件表达式的类型为<代码>布尔值。”

这同样适用于 Integer.intValue()

祝好!

I know it is old post, but look at very similar case and then vote me :P

Answering original question : only one operand is evaluated BUT:

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

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

This test will throw NullPointerException always and in this case IF statemat is not equivalent to ?: operator.

The reason is here http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25. The part about boxing/unboxing is embroiled, but it can be easy understood looking at:

"If one of the second and third operands is of type boolean and the type of the other is of type Boolean, then the type of the conditional expression is boolean."

The same applies to Integer.intValue()

Best regards!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文