为什么以下代码行会产生NullPointerException?
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
我知道取消装箱正在执行null,但为什么呢?
注意
Long v = (Long) null;
不会产生异常.
解决方法:
所以看起来很明显,如果条件为真,你只需要装箱,如果条件为假则不应该装箱.但是,三元运算符表达式必须具有特定的静态类型.所以我们有很长很长的路要走. JLS声明结果将是原始的(同样 – 如果运算符是,比如说,甚至是=).因此三元运算符将强制取消装箱,然后才能进行分配.
如果你要使用等效的if-else替换代码,那么你只需要从long到Long以及从Long到Long的赋值,这将不会有任何拆箱,因此运行正常.
Bliv& amp; Gafter的Java Puzzlers.