带有条件运算符的nullpointer异常(三元运算符)但不包含if else

时间:2016-12-26 13:19:29

标签: java nullpointerexception

如果我使用三元运算符,我会得到nullpointer异常。

Integer val = null;
Object res = val == null ? val : val.intValue();

但不是if else

    Integer val = null;
    Object res;
  if( val == null ) {
      res  = val;
  } else {
      res = val.intValue();
  }

任何人都可以解释原因吗?

由于 Sudar

1 个答案:

答案 0 :(得分:4)

您遇到的行为来自确定三元条件表达式类型的规则。

在您的情况下,表达式的类型

$order->update([
    'is_sent' => true,
    'items_array' => $response['items']
]);

val == null ? val : val.intValue();

这由JLS 15.25.指定:

  

条件表达式的类型确定如下:

     
      
  • 如果第二个和第三个操作数具有相同的类型(可能是null类型),那么这就是条件表达式的类型。

  •   
  • 如果第二个和第三个操作数之一是原始类型T,而另一个操作数的类型是将装箱转换(第5.1.7节)应用于T的结果,那么该类型的条件表达式为T

  •   

您的第二个操作数为int,第三个操作数为Integer,因此表达式的类型为int

因此,当val == null时,int是非盒子的(即为{null}调用val)并抛出val.intValue()

在你的if-else表达式NullPointerException中,如果其值为null,则不会取消装箱(因为您将其分配给val变量,因此没有Object

也就是说,由于您要将一个Integer变量分配给一个Object变量,因此任何一个片段中的条件都没有意义(因为将NullPointerException分配给int变量只需将{{1返回Object)。

您可以简单地指定

int

并获得相同的最终结果,没有例外。

相关问题