public class TestBox {
Integer i;
int j;
public static void main (String[] args) {
TestBox t = new TestBox();
t.go();
}
public void go() {
j = i;
System.out.println(j);
System.out.println(i);
}
}
我在行j=i
上得到一个空指针异常
虽然如果将此行转换为i=j
,我的输出为0 0
,这是int的默认值。
我的问题是,当i
分配给j
时,不应该i
取消装箱作为int变量并取默认值0而不是原来的默认空值?
答案 0 :(得分:5)
编译器翻译此作业
j = i;
......进入这个:
j = i.intValue( );
如果i
为空,则会获得NPE。
答案 1 :(得分:4)
来自JLS §5.1.8:
在运行时,取消装箱转换过程如下:
- 如果r为null,则取消装箱转换会抛出NullPointerException
要避免使用NPE,您需要在尝试将其分配给基元之前初始化i
(Integer
)
答案 2 :(得分:0)
因为原语中没有null
的等价物。当您尝试将i
取消null
到原始j
时,它将是NullPointerException,因为i
是null
。取消装箱null
始终抛出NullPointerException。这是根据JLS
如果r为null,则取消装箱转换会抛出NullPointerException
答案 3 :(得分:0)
您从未初始化i
,然后i
为null
,并且无法对其进行拆箱。
答案 4 :(得分:0)
使用某些值(例如
)初始化iInteger i = someValue;
您的整数i未初始化。如果你使用会出现错误的eclipse
答案 5 :(得分:0)
零被定义为原始整数实例变量的默认值,这是此默认值适用的唯一上下文。对于null-Integer值,假设零空气是非常不安全的。明智地,Java设计者没有这样定义它。