【问题标题】:Java ternary operator and NullPointerException [duplicate]Java三元运算符和NullPointerException [重复]
【发布时间】:2013-08-08 11:23:11
【问题描述】:

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

Integer test1=null;
Integer test2=null;

我这样称呼他们:

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

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

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

这段代码没问题。

但是,为什么?

【问题讨论】:

  • @Heuster 没错,答案是 a) 完全不明显,b) 很难用谷歌搜索。
  • 请注意JLS Conditional Operator 中关于如何计算表达式的规则。
  • @Rohit Jain,谢谢你的回答,我知道。

标签: java nullpointerexception ternary-operator


【解决方案1】:

这里

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

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

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

例如试试这个:

    Integer a = null;
    int b = a;

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

当涉及null 时,我强烈建议不要将Integersint 混合使用。解决这些问题是完全的噩梦(我现在正在研究这样的东西,涉及返回 intsIntegers 的方法调用,并传递 null。一个简单的方法返回意外爆炸)。

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

【讨论】:

    【解决方案2】:
    test2=(test1==null?test1:(test1+1));
    

    等价于

       if(test1==null)
    {
        test2 = test1;
    }
    
    else{
    
       test2 = test1 + 1;    
    }
    

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

    快乐编码:)

    【讨论】:

    • 好吧,这不是这里发生的事情。由于test1null,因此您的if-else 块不会抛出NPE,而在条件运算符情况下会抛出。
    • 我写这个只是为了解释他的情况
    • 对不起,我不应该使用“等价于”
    【解决方案3】:

    执行以下操作:

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

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2014-09-29
      • 1970-01-01
      • 2011-12-31
      • 2015-03-25
      • 2021-04-14
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多