1

你好,我在工作中遇到一个问题,问题是这样的:

Integer test1=null;
Integer test2=null;

我这样称呼他们:

test2=(test1==null?test1:(test1+1));
test2=(test1==null?test1:-1);

然后java抛出一个NullPointerException,所以我写了另一个这样的代码:

test2=(test1==null?test1:test1); 

这段代码没问题。

但为什么?

4

3 回答 3

7

这里

test2=(test1==null?test1:(test1+1));

该表达式将返回一个int,而不是一个Integer

因此 JVM 将 unbox test1,然后将结果装箱。如果你拆箱 a null,它会抛出一个 NPE。

例如试试这个:

    Integer a = null;
    int b = a;

您将在第二行获得 NPE。但这肯定是一个简单的整数赋值!?不是这样。它正在拆箱空值。

我强烈建议不要混合Integers以及int何时null参与。解决这些问题是一场彻头彻尾的噩梦(我现在正在研究这样的东西,涉及方法调用返回intsand Integers,并传递 null 。一个简单的方法返回意外地爆炸了)。

如果您有一个“可选”整数结果,那么我建议不要使用 null,而是使用某种可选包装器。

于 2013-08-08T11:28:33.903 回答
2
test2=(test1==null?test1:(test1+1));

相当于

   if(test1==null)
{
    test2 = test1;
}

else{

   test2 = test1 + 1;    
}

请注意,您永远不能对 null 进行任何操作(这里您正在执行 test1 + 1 ,这相当于 null + 1 。因此出现空指针异常)

快乐编码:)

于 2013-08-08T11:36:50.560 回答
0

执行以下操作:

test2=(test1==null?test1: new Integer(test1+1));
test2=(test1==null?test1: new Integer(-1));
于 2013-08-08T11:33:32.370 回答