带有null Long的三元表达式中的NullPointerException

为什么以下代码行会产生NullPointerException

 Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null; 

我知道取消装箱正在执行null ,但为什么呢?

注意

 Long v = (Long) null; 

不会产生exception。

所以很明显,如果条件为真,你只需要装箱,如果条件为假则不应该装箱。 但是,三元运算符表达式必须具有特定的静态类型。 所以我们有long 。 JLS声明结果将是原始的(同样 – 如果运算符是,或者说,或者甚至== )。 因此三元运算符将强制取消装箱,然后才能进行分配。

如果你要使用等效的if-else替换代码,那么你只需要从longLong以及从LongLong的赋值,这将不会有任何拆箱,因此运行正常。

IIRC,这是Bloch&Gafter的Java Puzzlers。

来自JSL

  1. 如果第二个和第三个操作数具有相同的类型(可以是null类型),那么这就是条件表达式的类型。
  2. 如果第二个和第三个操作数之一的类型为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;