为什么以下代码行会生成NullPointerException
?
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
我知道正在null
上进行拆箱,但为什么?
请注意
Long v = (Long) null;
不会产生异常。
答案 0 :(得分:9)
所以看起来很明显,如果条件为真,你只需要装箱,如果条件为假则不应该装箱。但是,三元运算符表达式必须具有特定的静态类型。我们有Long
和long
。 JLS声明结果将是原始的(同样 - 假设运算符是+
或甚至==
)。因此,三元运算符将强制取消装箱,然后分配才会导致装箱。
如果您要使用等效的if-else
替换代码,那么您只需要从long
到Long
以及从Long
到{{1 ,没有任何拆箱,所以运行正常。
答案 1 :(得分:0)
来自JSL
- 如果第二个和第三个操作数具有相同的类型(可能是null类型),那么这就是条件表达式的类型。
- 如果第二个和第三个操作数之一是
醇>boolean
类型而另一个操作数的类型是Boolean
类型,则其类型为 条件表达式为boolean
。
在以下语句中,第二个操作数的类型为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;