为什么我在这里得到NullPointerException?

时间:2011-08-26 12:59:12

标签: java

Long n = null;
for (Long price : new Long[]{null, 2L, 10L}) {          
n = (n != null) ? 0L : price;   
}

我很难过,为什么我在执行此代码时会获得NPE? 似乎只是一个简单的n = price赋值,其中price为null。 不要担心它意味着什么,这没有任何意义。

6 个答案:

答案 0 :(得分:10)

n = (n != null) ? 0L : price;行中,您有longLong作为?:语句的替代方案。 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的类型。如果pricenull,则会生成NPE。

这个表达式有效,因为它避免了隐式类型强制:

n = (n != null) ? new Long( 0L ) : price ;

但正如其他人在评论中所说,无论如何,你在这里所做的事似乎没有多大意义。