Integer i = null;
int j = i;
System.out.println(j);
为什么会抛出NullPointerException
并且不会将j
的值打印为0
?
答案 0 :(得分:3)
Integer
是一个对象。因此它是可以为空的。
Integer i = null;
是对的。
另一方面, int
是一个原始值,因此不可为空。
int j = i;
相当于
int j = null;
这是不正确的,并抛出NullPointerException
。
感谢JNYRanger:
从原始值对象包装器到其原始等价物的隐式转换称为“unboxing”,并且只要该对象保持非空值,就会起作用。
Integer i = 12;
int j = i;
System.out.println(j);
按预期输出12。
答案 1 :(得分:1)
之所以会这样,是因为当为int类型变量分配了Integer类型对象时,java编译器会尝试通过调用Integer引用上的intValue()方法来取消对象的值的装箱。在您的情况下,java编译器尝试通过调用i.intValue()
来取消对对象i的装箱。
现在由于i为null,因此在null引用上调用任何方法都会导致NullPointerException,这就是您所遇到的情况。
答案 2 :(得分:0)
此操作失败,因为当您将i
分配给j
时,JVM会尝试取消隐藏int
中包含的原始i
值以将其分配给j
。由于i
为null,因此失败并显示空指针异常。