当前位置: 首页 > 面试题库 >

条件运算符(三元运算符)的Nullpointer异常,如果不是,则为空

董霖
2023-03-14
问题内容

如果使用三元运算符,则会出现nullpointer异常。

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

但是如果没有

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

谁能解释为什么?

谢谢苏达


问题答案:

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

就您而言,表达式的类型

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

int

这由JLS
15.25
指定。:

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

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

  • 如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,那么条件表达式的类型为T

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

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

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

就是说,由于您要将Integer变量分配给Object变量,因此您在任一摘录中的条件都是没有意义的(因为将an分配intObject变量只是将intbackto 装箱Integer)。

您可以简单地分配

Object res = val;

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



 类似资料:
  • 如果我使用三元运算符,我会得到nullpointer异常。 但不与if else一起使用 谁能解释一下原因吗? 谢谢Sudar

  • 实际上,三元运算符的语言示例中是否有一个内置的不是以下形式的(条件运算符)? 我不是在找一种特定的语言,虽然至少有中等程度的流行度会更好。

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

  • 问题内容: 如果我想实现一些可以通过两种方式实现的条件代码。那么哪种方式更好的是条件运算符?:或if..then..else ?? 问题答案: 这取决于。通常,您希望活动的主要流程在代码的结构中表示。如果算法的关键是变量已初始化,那么最好的解决方案是使用条件运算符: 如果决策是了解正在发生的事情的关键问题,那么您将首选。实际上,这意味着当两者都可行时,您将使用。关键是“合理” —如果您发现在子表达

  • 在Kotlin中,这个表达式的等价物是什么? 这不是Kotlin中的有效代码。

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