java将空对象转换为整数
我正在努力理解下面的代码。第2行输出null,而第3行抛出NullPointerException。我错过了什么?从理论上讲,这应该是可行的
public static void main(String []args){
1 Object[] obj = {null};
2 System.out.println((Integer)obj[0]); //Output null
3 Integer n = obj[0] == null ? (Integer)obj[0] : 1; //NullPointerException
4 System.out.println(n);
}
# 1 楼答案
根据JLS中定义的规则,三元条件运算符的类型
是
int
,不是Integer
因此,当这个表达式的结果是
(Integer)obj[0]
时,将Integer
解绑到int
,得到NullPointerException
见JLS 15.25. Conditional Operator ? :,表15.25-A:
由于第二个操作数是
Integer
,第三个操作数是int
,因此条件表达式类型是int
# 2 楼答案
这里的关键概念是binary numeric promotion
为运算符提供不同类型的操作数时,必须将操作数转换为彼此兼容。此转换的条件运算符规则相当复杂;但当操作数类型不同且可转换为数字时,将应用二进制数字提升
在提供一个装箱操作数和一个基本操作数的情况下,二进制数值提升的效果是尝试取消装箱操作数的装箱,而不是以装箱基本操作数
您可以使用其他多操作数运算符观察二进制数字提升,例如
+
:使用条件运算符时,如果显式框选1,则不会得到NPE,因为操作数不是不同的类型: