Java 分配给基元int的Null Integer对象引发NullPointerException

Java 分配给基元int的Null Integer对象引发NullPointerException,java,default-value,Java,Default Value,为什么它抛出NullPointerException,并且不将j的值打印为0?整数是一个对象。因此,它可以为空 Integer i = null; int j = i; System.out.println(j); Integer i = null; 这是正确的 另一方面,int是一个基本值,因此不可为空 Integer i = null; int j = i; System.out.println(j); Integer i = null; 相当于 int j = i; 这是不正确的

为什么它抛出
NullPointerException
,并且不将
j
的值打印为
0

整数
是一个对象。因此,它可以为空

Integer i = null;
int j = i;
System.out.println(j);
Integer i = null;
这是正确的

另一方面,
int
是一个基本值,因此不可为空

Integer i = null;
int j = i;
System.out.println(j);
Integer i = null;
相当于

int j = i;
这是不正确的,并抛出一个
NullPointerException

感谢JNYRanger的扩展:

这种从基元值对象包装器到其基元等价物的隐式转换称为“”,并在对象持有非空值时立即生效

int j = null;

按预期输出12。

这会失败,因为当您将
i
分配给
j
时,JVM会尝试取消包含在
i
中的原语
int
值的装箱,以将其分配给
j
。由于
i
为null,这将失败,并出现null指针异常。

这种情况会发生,因为当为int类型变量分配一个整数类型对象时,java编译器会尝试通过调用Integer引用上的intValue()方法取消对象值的装箱。在您的例子中,java编译器通过调用
i.intValue()
尝试取消对象i的装箱


现在,由于我是null,在null引用上调用任何方法都会导致NullPointerException,这就是在您的案例中发生的情况。

这是Java,我认为?[这个答案][1]有相当多的细节可以解释它。[1] :这是正确的答案,但我只是想补充一点:如果OP在任何一点实际为j赋值,那么该语句将是有效的。这是由于一个称为“取消装箱”的过程,即将对象转换为基本体。在这种情况下取消装箱失败时,将抛出NullPointerException。(@XLAnt我知道你可能知道这一点,但只是想为提问者指出这一点)扩展了一点。谢谢:)克里斯,你的回答对我来说似乎更有说服力。谢谢