如果我使用三元运算符,我会得到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
答案 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
并获得相同的最终结果,没有例外。