在自动装箱中,转换是基于我们分配给的变量/引用还是反过来?

时间:2013-06-26 16:07:40

标签: java autoboxing

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而不是原来的默认空值?

6 个答案:

答案 0 :(得分:5)

编译器翻译此作业

j = i;

......进入这个:

j = i.intValue( );

如果i为空,则会获得NPE。

答案 1 :(得分:4)

来自JLS §5.1.8

  

在运行时,取消装箱转换过程如下:

     
      
  • 如果r为null,则取消装箱转换会抛出NullPointerException
  •   

要避免使用NPE,您需要在尝试将其分配给基元之前初始化iInteger

答案 2 :(得分:0)

因为原语中没有null的等价物。当您尝试将i取消null到原始j时,它将是NullPointerException,因为inull。取消装箱null始终抛出NullPointerException。这是根据JLS

  

如果r为null,则取消装箱转换会抛出NullPointerException

答案 3 :(得分:0)

您从未初始化i,然后inull,并且无法对其进行拆箱。

答案 4 :(得分:0)

使用某些值(例如

)初始化i
Integer i = someValue;

您的整数i未初始化。如果你使用会出现错误的eclipse

答案 5 :(得分:0)

零被定义为原始整数实例变量的默认值,这是此默认值适用的唯一上下文。对于null-Integer值,假设零空气是非常不安全的。明智地,Java设计者没有这样定义它。