Sud*_*ddy 1 java nullpointerexception
如果我使用三元运算符,我会收到空指针异常。
Integer val = null;
Object res = val == null ? val : val.intValue();
Run Code Online (Sandbox Code Playgroud)
但不能与 if else 一起使用
Integer val = null;
Object res;
if( val == null ) {
res = val;
} else {
res = val.intValue();
}
Run Code Online (Sandbox Code Playgroud)
谁能解释一下为什么吗?
谢谢苏达尔
您遇到的行为是由确定三元条件表达式类型的规则产生的。
\n在你的情况下,表达式的类型
\nval == null ? val : val.intValue();\nRun Code Online (Sandbox Code Playgroud)\n是int。
JLS 15.25对此进行了规定。:
\n\n\n条件表达式的类型确定如下:
\n\n
\n- \n
如果第二个和第三个操作数具有相同的类型(可能是 null 类型),则这就是条件表达式的类型。
\n- \n
如果第二个和第三个操作数之一是原始类型 T,而另一个的类型是对 T 应用装箱转换 (\xc2\xa75.1.7) 的结果,则条件表达式的类型为 T。
\n
您的第二个操作数是Integer,第三个操作数是int,因此表达式的类型是int。
因此,当 val == null 时,val被取消装箱(即val.intValue()调用 null 值)并且NullPointerException抛出 a 。
在 if-else 表达式中,val当其值为 null 时,它不会被拆箱(因为您将它分配给一个Object变量,所以没有NullPointerException.
也就是说,由于您将 Integer 变量分配给 Object 变量,因此两个片段中的条件都是毫无意义的(因为将 an 分配int给Object变量只是将后面的框框int到Integer)。
您可以简单地分配
\nObject res = val;\nRun Code Online (Sandbox Code Playgroud)\n并得到相同的最终结果,无一例外。
\n