条件运算符(三元运算符)出现空指针异常,但 if else 则不出现空指针异常

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)

谁能解释一下为什么吗?

谢谢苏达尔

Era*_*ran 5

您遇到的行为是由确定三元条件表达式类型的规则产生的。

\n

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

\n
val == null ? val : val.intValue();\n
Run Code Online (Sandbox Code Playgroud)\n

int

\n

JLS 15.25对此进行了规定

\n
\n

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

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

    \n
  • \n
  • 如果第二个和第三个操作数之一是原始类型 T,而另一个的类型是对 T 应用装箱转换 (\xc2\xa75.1.7) 的结果,则条件表达式的类型为 T

    \n
  • \n
\n
\n

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

\n

因此,当 val == null 时,val被取消装箱(即val.intValue()调用 null 值)并且NullPointerException抛出 a 。

\n

在 if-else 表达式中,val当其值为 null 时,它不会被拆箱(因为您将它分配给一个Object变量,所以没有NullPointerException.

\n

也就是说,由于您将 Integer 变量分配给 Object 变量,因此两个片段中的条件都是毫无意义的(因为将 an 分配intObject变量只是将后面的框框intInteger)。

\n

您可以简单地分配

\n
Object res = val;\n
Run Code Online (Sandbox Code Playgroud)\n

并得到相同的最终结果,无一例外。

\n