带有null Long的三元表达式中的NullPointerException
为什么以下代码行会产生NullPointerException
?
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
我知道取消装箱正在执行null
,但为什么呢?
注意
Long v = (Long) null;
不会产生exception。
所以很明显,如果条件为真,你只需要装箱,如果条件为假则不应该装箱。 但是,三元运算符表达式必须具有特定的静态类型。 所以我们有long
。 JLS声明结果将是原始的(同样 – 如果运算符是,或者说,或者甚至==
)。 因此三元运算符将强制取消装箱,然后才能进行分配。
如果你要使用等效的if-else
替换代码,那么你只需要从long
到Long
以及从Long
到Long
的赋值,这将不会有任何拆箱,因此运行正常。
IIRC,这是Bloch&Gafter的Java Puzzlers。
来自JSL
- 如果第二个和第三个操作数具有相同的类型(可以是null类型),那么这就是条件表达式的类型。
- 如果第二个和第三个操作数之一的类型为
boolean
,而另一个操作数的类型为Boolean
类型,则条件表达式的类型为boolean
。
在下面的语句中,第二个操作数的类型是long
,第三个是Long
。
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
如果表达式为true,这将起作用。
Long v= 1 == 1 ? Long.MAX_VALUE : (Long) null;
或者你可以施展它。
Long v= 1 == 2 ? Long.valueOf(Long.MAX_VALUE) : (Long) null;