gpt4 book ai didi

java - 通过 Java 三元运算符的自动装箱行为引发 NullPointerException

转载 作者:行者123 更新时间:2023-12-02 11:21:03 24 4
gpt4 key购买 nike

前几天,我遇到了一个非常奇怪的 NullPointerException ,这是由三元运算符中意外的类型转换引起的。给定这个(无用的示例)函数:

Integer getNumber() {
return null;
}

我期望以下两个代码段在编译后完全相同:

Integer number;
if (condition) {
number = getNumber();
} else {
number = 0;
}

对比

Integer number = (condition) ? getNumber() : 0;

.

事实证明,如果 conditiontrue,则 if 语句可以正常工作,而第二个代码段中的三元操作会抛出NullPointerException。似乎三元运算已决定将两个选择类型转换为 int,然后将结果自动装箱回 Integer!?!事实上,如果我显式地将 0 转换为 Integer,异常就会消失。换句话说:

Integer number = (condition) ? getNumber() : 0;

与以下内容不同:

Integer number = (condition) ? getNumber() : (Integer) 0;

.

因此,三元运算符和等效的 if-else 语句之间似乎存在字节码差异(这是我没想到的)。这就提出了三个问题:为什么会有差异?这是三元实现中的错误还是有类型转换的原因?鉴于存在差异,三元运算的性能是否比等效的 if 语句更高或更差(我知道,差异不会很大,但仍然如此)?

最佳答案

根据JLS :-

The type of a conditional expression is determined as follows:

  • If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression.
  • If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion
    (§5.1.7) to T, then the type of the conditional expression is T.

关于java - 通过 Java 三元运算符的自动装箱行为引发 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46178752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com