如果使用三元运算符,则会出现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分配int
给Object
变量只是将int
backto 装箱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. 语