有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么这里会出现NullPointerException?

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

我很困惑,为什么我在执行这段代码时会得到一个NPE? 似乎只是一个简单的赋值n=price,其中price为null。 别担心这意味着什么,这毫无意义


共 (6) 个答案

  1. # 1 楼答案

    n = (n != null) ? 0L : price;行中,有一个long和一个Long作为?:语句的替代。Java将把它分析为类型long,并尝试取消对Long的装箱,而不是对long的装箱。当price为空时,就像在第一次迭代中一样,这将生成一个NPE

  2. # 2 楼答案

    这是因为价格被取消绑定以匹配三元运算符中的0L返回可能性

    请尝试:

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

    一切都会顺利进行

  3. # 3 楼答案

    它试图将price强制为原语long,以匹配0L的类型。如果pricenull,则生成NPE

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

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

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

  4. # 4 楼答案

    试一试

     n = (price != null) ? price : 0L;
    
  5. # 5 楼答案

    如果查看字节码,就会出现这种情况

     49:    invokevirtual   #26; //Method java/lang/Long.longValue:()J
     52:    invokestatic    #20; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
    

    进行比较时,对该数组中的每个项执行Long.longValue,从而导致NullPointerException。问题是,三元表达式与自动装箱相结合,掩盖了真正发生的事情

  6. # 6 楼答案

    线路

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

    被编译成

    n = Long.valueOf(n == null ? price.longValue() : 0L);
    

    pricenull时,语句price.longValue()抛出NullPointerException。尝试用new Long[] {1L, 2L, 3L}替换数组,并查看它是否正常工作