Java 将空对象强制转换为整数

Java 将空对象强制转换为整数,java,nullpointerexception,Java,Nullpointerexception,我正在努力理解下面的代码。第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] :

我正在努力理解下面的代码。第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);
 }

根据JLS中定义的规则,三元条件运算符的类型

null ? (Integer)obj[0] : 1;
int
,不是
Integer

因此,当此表达式的结果为
(Integer)obj[0]
时,
整数
将被取消绑定到
int
,您将获得
NullPointerException

见表15.25-A:

由于第二个操作数是
Integer
,第三个操作数是
int
,因此条件表达式类型是
int

,这里的关键概念是

为运算符提供不同类型的操作数时,必须将操作数转换为彼此兼容。此转换的条件运算符规则相当复杂;但当操作数类型不同且可转换为数字时,将应用二进制数字提升

在提供一个装箱操作数和一个基本操作数的情况下,二进制数值提升的效果是尝试取消装箱操作数的装箱,而不是装箱基本操作数

您可以使用其他多操作数运算符观察二进制数字提升,例如
+

System.out.println(1 + (Integer) null); // NullPointerException!
使用条件运算符时,如果显式框选1,则不会得到NPE,因为操作数不是不同的类型:

Integer n = obj[0] == null ? (Integer)obj[0] : Integer.valueOf(1);

很好地解释了为什么代码的行为是这样的。实际上,更好的答案是imho。在询问行为方面,使用数组和转换为整数会给代码增加额外的噪音:
Integer num=null
将更容易,并且在语义上是等价的。