java为什么这里会出现NullPointerException?
Long n = null;
for (Long price : new Long[]{null, 2L, 10L}) {
n = (n != null) ? 0L : price;
}
我很困惑,为什么我在执行这段代码时会得到一个NPE? 似乎只是一个简单的赋值n=price,其中price为null。 别担心这意味着什么,这毫无意义
你可以在下面搜索框中键入要查询的问题!
Long n = null;
for (Long price : new Long[]{null, 2L, 10L}) {
n = (n != null) ? 0L : price;
}
我很困惑,为什么我在执行这段代码时会得到一个NPE? 似乎只是一个简单的赋值n=price,其中price为null。 别担心这意味着什么,这毫无意义
# 1 楼答案
在
n = (n != null) ? 0L : price;
行中,有一个long
和一个Long
作为?:
语句的替代。Java将把它分析为类型long
,并尝试取消对Long
的装箱,而不是对long
的装箱。当price
为空时,就像在第一次迭代中一样,这将生成一个NPE# 2 楼答案
这是因为价格被取消绑定以匹配三元运算符中的
0L
返回可能性请尝试:
一切都会顺利进行
# 3 楼答案
它试图将
price
强制为原语long
,以匹配0L
的类型。如果price
为null
,则生成NPE此表达式有效,因为它避免了隐式类型强制:
但正如其他人在评论中所说,你在这里所做的似乎没有多大意义
# 4 楼答案
试一试
# 5 楼答案
如果查看字节码,就会出现这种情况
进行比较时,对该数组中的每个项执行
Long.longValue
,从而导致NullPointerException
。问题是,三元表达式与自动装箱相结合,掩盖了真正发生的事情# 6 楼答案
线路
被编译成
当
price
为null
时,语句price.longValue()
抛出NullPointerException
。尝试用new Long[] {1L, 2L, 3L}
替换数组,并查看它是否正常工作