当前位置: 首页 > 知识库问答 >
问题:

Nullpointer异常与条件运算符(三元运算符)有关,但与if else[duplicate]无关

曹景铄
2023-03-14

如果我使用三元运算符,我会得到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个答案

隆璞
2023-03-14

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

在您的示例中,表达式的类型

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

int

这是由JLS15.25指定的。:

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

>

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

    如果第二个和第三个操作数中的一个是原语类型T,而另一个的类型是对T应用装箱转换(§5.1.7)的结果,那么条件表达式的类型是T。

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

    因此,当val==null时,val被取消装箱(即对于null值调用val.intvalue())并引发NullPointerException

    在if-else表达式中,当val的值为null时,它不会被取消装箱(因为您将其赋给了object变量,所以不存在NullPointerException

    也就是说,由于您要将一个整数变量赋给一个对象变量,因此在两个代码段中的条件都没有意义(因为将一个int赋给一个Object变量只是将int框回Integer)。

    您可以简单地分配

    Object res = val;
    

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

  •  类似资料:
    • 问题内容: 如果使用三元运算符,则会出现nullpointer异常。 但是如果没有 谁能解释为什么? 谢谢苏达 问题答案: 您遇到的行为是由确定三元条件表达式的类型的规则导致的。 就您而言,表达式的类型 是。 这由JLS 15.25 指定。: 条件表达式的类型确定如下: 如果第二个操作数和第三个操作数具有相同的类型(可能为null类型),则这是条件表达式的类型。 如果第二和第三个操作数中的一个是原

    • GCC(4.8.2版)手册中规定了以下内容: < code >-ftree-loop-if-convert-stores :< br >尝试同时if-convert包含内存写入的条件跳转。这种转换对于多线程程序来说是不安全的,因为它将有条件的内存写入转换为无条件的内存写入。举个例子, 被转换为 可能产生数据竞争。 然而,我想知道使用与语句。 < li >在第一段代码中,只有满足条件时,< code

    • 问题内容: 如果Python没有三元条件运算符,是否可以使用其他语言构造来模拟一个? 问题答案: 它是在2.5版中添加的。表达式语法为: 第一被评估,则恰好中的任一个a或b进行评估并返回基于所述布尔值。如果为,则被评估并返回但被忽略,否则被评估为返回但被忽略。 这允许发生短路,因为仅当评估为时才进行评估,而b根本不评估,而当为 评估时,仅当评估时就完全不评估。 例如: 注意条件是表达式,而不是语句

    • 如果Python没有三元条件运算符,是否可以使用其他语言构造来模拟一个?

    • 三元运算符 三元运算符 ? 应该只用在它能让代码更加清楚的地方。 一个条件语句的所有的变量应该是已经被求值了的。类似 if 语句,计算多个条件子句通常会让语句更加难以理解。或者可以把它们重构到实例变量里面。 推荐: result = a > b ? x : y; 不推荐: result = a > b ? x = c > d ? c : d : y; 当三元运算符的第二个参数(if 分支)返回和条

    • 条件(三元)运算符是 JavaScript 仅有的使用三个操作数的运算符。一个条件后面会跟一个问号(?),如果条件为 truthy ,则问号后面的表达式A将会执行;表达式A后面跟着一个冒号(:),如果条件为 falsy ,则冒号后面的表达式B将会执行。本运算符经常作为 if 语句的简捷形式来使用。(MDN) 三元运算符,也称条件运算符、三目运算符。 三元运算符可以代替简单的 if 语句。 1. 语