Java三元运算符和NullPointerException

时间:2013-08-08 11:23:12

标签: java nullpointerexception ternary-operator

嗨,我在作品中遇到了问题,这样的问题:

Integer test1=null;
Integer test2=null;
我打电话给他们是这样的:

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

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

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

此代码没问题。

但是,为什么呢?

3 个答案:

答案 0 :(得分:7)

下面

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

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

因此JVM将取消装箱test1,然后将结果打包。如果您取消装箱null,它将抛出一个NPE。

e.g。试试这个:

    Integer a = null;
    int b = a;

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

我强烈建议在涉及Integers时混淆intnull。解决这些问题是一个完全噩梦(我现在正在研究这样的问题,包括返回intsIntegers的方法调用,并传递null。一个简单的方法返回意外爆发)。

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

答案 1 :(得分:2)

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

相当于

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

else{

   test2 = test1 + 1;    
}

请注意,你永远不能对null做任何操作(这里你做的是test1 + 1,相当于null + 1。因此空指针异常)

快乐编码:)

答案 2 :(得分:0)

做类似的事情:

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