Long n = null;
for (Long price : new Long[]{null, 2L, 10L}) {
n = (n != null) ? 0L : price;
}
我很难过,为什么我在执行此代码时会获得NPE? 似乎只是一个简单的n = price赋值,其中price为null。 不要担心它意味着什么,这没有任何意义。
答案 0 :(得分:10)
在n = (n != null) ? 0L : price;
行中,您有long
和Long
作为?:
语句的替代方案。 Java将从long
类型开始解释此问题,并尝试将Long
取消装箱,而不是long
。当price
为null时,就像在第一次迭代中一样,这将生成一个NPE。
答案 1 :(得分:3)
这是因为价格被取消装箱以匹配三元运营商的0L
退货可能性。
尝试改为:
Long n = null;
for (Long price : new Long[]{null, 2L, 10L}) {
n = (n != null) ? new Long(0L) : price;
}
一切都会顺利进行。
答案 2 :(得分:2)
如果查看字节代码,就会发生这种情况
49: invokevirtual #26; //Method java/lang/Long.longValue:()J
52: invokestatic #20; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
在进行比较时,正在对该阵列中的每个项目执行Long.longValue
,导致您NullPointerException
。问题是,与AutoBoxing结合使用的三元表达式模糊了真正发生的事情。
答案 3 :(得分:2)
该行
n = (n != null) ? 0L : price;
汇编成
n = Long.valueOf(n == null ? price.longValue() : 0L);
当price.longValue()
为NullPointerException
时,语句price
会引发null
。尝试用new Long[] {1L, 2L, 3L}
替换数组,看看它是否有效。
答案 4 :(得分:1)
尝试
n = (price != null) ? price : 0L;
答案 5 :(得分:0)
它正在尝试将price
强制转换为原始long
,以匹配0L
的类型。如果price
为null
,则会生成NPE。
这个表达式有效,因为它避免了隐式类型强制:
n = (n != null) ? new Long( 0L ) : price ;
但正如其他人在评论中所说,无论如何,你在这里所做的事似乎没有多大意义。