1
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 而不是其原始默认值 null 吗?

4

6 回答 6

5

编译器翻译这个赋值

j = i;

...进入这个:

j = i.intValue( );

如果i为空,您将获得 NPE。

于 2013-06-26T16:11:28.597 回答
4

JLS §5.1.8

在运行时,拆箱转换按如下方式进行:

  • 如果 r 为 null,则拆箱转换将引发 NullPointerException

为避免 NPE,您需要在尝试将i(an Integer) 分配给原语之前对其进行初始化

于 2013-06-26T16:10:56.227 回答
0

null因为在原语中没有等价物。当您尝试拆箱i哪个是null原始j的时,它将是一个iNullPointerException null。拆箱null总是抛出 NullPointerException。这是根据JLS

如果 r 为 null,则拆箱转换将引发 NullPointerException

于 2013-06-26T16:09:35.747 回答
0

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

于 2013-06-26T16:10:23.853 回答
0

用一些值初始化 i

Integer i = someValue;

您的 Integer i 未初始化。如果你使用 eclipse 会显示错误

于 2013-06-26T16:11:14.667 回答
0

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

于 2013-06-26T16:13:04.140 回答