你好,我在工作中遇到一个问题,问题是这样的:
Integer test1=null;
Integer test2=null;
我这样称呼他们:
test2=(test1==null?test1:(test1+1));
test2=(test1==null?test1:-1);
然后java抛出一个NullPointerException,所以我写了另一个这样的代码:
test2=(test1==null?test1:test1);
这段代码没问题。
但为什么?
你好,我在工作中遇到一个问题,问题是这样的:
Integer test1=null;
Integer test2=null;
我这样称呼他们:
test2=(test1==null?test1:(test1+1));
test2=(test1==null?test1:-1);
然后java抛出一个NullPointerException,所以我写了另一个这样的代码:
test2=(test1==null?test1:test1);
这段代码没问题。
但为什么?
这里
test2=(test1==null?test1:(test1+1));
该表达式将返回一个int
,而不是一个Integer
。
因此 JVM 将 unbox test1
,然后将结果装箱。如果你拆箱 a null
,它会抛出一个 NPE。
例如试试这个:
Integer a = null;
int b = a;
您将在第二行获得 NPE。但这肯定是一个简单的整数赋值!?不是这样。它正在拆箱空值。
我强烈建议不要混合Integers
以及int
何时null
参与。解决这些问题是一场彻头彻尾的噩梦(我现在正在研究这样的东西,涉及方法调用返回ints
and Integers
,并传递 null 。一个简单的方法返回意外地爆炸了)。
如果您有一个“可选”整数结果,那么我建议不要使用 null,而是使用某种可选包装器。
test2=(test1==null?test1:(test1+1));
相当于
if(test1==null)
{
test2 = test1;
}
else{
test2 = test1 + 1;
}
请注意,您永远不能对 null 进行任何操作(这里您正在执行 test1 + 1 ,这相当于 null + 1 。因此出现空指针异常)
快乐编码:)
执行以下操作:
test2=(test1==null?test1: new Integer(test1+1));
test2=(test1==null?test1: new Integer(-1));