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