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

时间:2011-12-15 02:41:58

标签: java nullpointerexception

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

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

我知道正在null上进行拆箱,但为什么?

请注意

Long v = (Long) null;

不会产生异常。

2 个答案:

答案 0 :(得分:9)

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

如果您要使用等效的if-else替换代码,那么您只需要从longLong以及从Long到{{1 ,没有任何拆箱,所以运行正常。

IIRC,这是Bloch& amp; Gafter的Java Puzzlers。

答案 1 :(得分:0)

来自JSL

  
      
  1. 如果第二个和第三个操作数具有相同的类型(可能是null类型),那么这就是条件表达式的类型。
  2.   
  3. 如果第二个和第三个操作数之一是boolean类型而另一个操作数的类型是Boolean类型,则其类型为   条件表达式为boolean
  4.   

在以下语句中,第二个操作数的类型为long,第三个操作数为Long

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

如果表达式为真,这将起作用。

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

或者你可以施展它。

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