【问题标题】:Nullpointer exception with conditional operator, (ternary operator) but not with if else [duplicate]Nullpointer 异常与条件运算符,(三元运算符)但不与 if else [重复]
【发布时间】:2017-05-10 22:59:19
【问题描述】:

如果我使用三元运算符,我会收到空​​指针异常。

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

但如果不是的话

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

谁能解释一下原因?

谢谢 苏达尔

【问题讨论】:

    标签: java nullpointerexception


    【解决方案1】:

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

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

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

    int

    这是由JLS 15.25. 指定的:

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

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

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

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

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

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

    也就是说,由于您将 Integer 变量分配给 Object 变量,因此您在任何一个 sn-ps 中的条件都是没有意义的(因为将 int 分配给 Object 变量只是将 int 框回Integer)。

    你可以简单地分配

    Object res = val;
    

    并毫无例外地获得相同的最终结果。

    【讨论】:

    • 感谢 Eran 的快速响应。我试图在第三个参数中分配 Integer 对象,它分配 null 而不抛出空指针异常。整数 y = null;对象 res = val == null ?值:y;
    猜你喜欢
    • 2015-06-05
    • 2012-07-23
    • 2019-10-21
    • 2022-12-06
    • 2023-03-03
    • 1970-01-01
    • 2021-12-08
    • 2021-03-31
    • 2010-12-12
    相关资源
    最近更新 更多