NullPointer通过Java三元运算符的自动装箱行为的异常
2022-09-03 12:34:14
前几天,我绊倒了一个非常奇怪的,这是由三元运算符中意外的类型转换引起的。给定此(无用的示例性)函数:NullPointerException
Integer getNumber() {
return null;
}
我期望以下两个代码段在编译后完全相同:
Integer number;
if (condition) {
number = getNumber();
} else {
number = 0;
}
与。
Integer number = (condition) ? getNumber() : 0;
.
事实证明,如果 是 ,-语句工作正常,而第二个代码段中的三元 opration 会抛出一个 .似乎三元运算已经决定在将结果自动装箱回!?!事实上,如果我显式地将 to 转换为 ,则异常会消失。换句话说:condition
true
if
NullPointerException
int
Integer
0
Integer
Integer number = (condition) ? getNumber() : 0;
不等同于:
Integer number = (condition) ? getNumber() : (Integer) 0;
.
因此,似乎三元运算符和等效的 -语句之间存在字节码差异(这是我没想到的)。这就提出了三个问题:为什么会有差异?这是三元实现中的错误,还是类型强制转换的原因?鉴于存在差异,三元运算的性能是否比等效的-语句更高或更低(我知道,差异不可能很大,但仍然如此)?if-else
if