gpt4 book ai didi

带有自动装箱的三元运算符中的Java NPE?

转载 作者:IT老高 更新时间:2023-10-28 20:50:39 27 4
gpt4 key购买 nike

今天早上我遇到了一个非常奇怪的 NPE,并将其简化为一个简单的示例。这是 JVM 错误还是正确的行为?

public class Test1 {
class Item {
Integer id = null;
public Integer getId() {return id;}
}
public Integer f() {
Item item = new Item();
// this works:
//return item == null ? new Integer(1) : item.getId();

// NPE??
return item == null ? 1 : item.getId();
}
public static void main(String[] args) {
Test1 t = new Test1();
System.out.println("id is: " + String.valueOf(t.f()));
}
}

编译和运行的输出:

$ javac Test1.java 
$ java Test1
Exception in thread "main" java.lang.NullPointerException
at Test1.f(Test1.java:12)
at Test1.main(Test1.java:16)
$

最佳答案

表达式 item == null 的类型? 1 : item.getId()int 而不是 Integer。因此,Java 需要将您的 Integer 自动拆箱为 int(导致 NullPointerException)。然后它将结果自动装箱回一个 Integer(如果不是 NullPointerException,它)从方法返回。

另一方面,表达式 item == null ? new Integer(1) : item.getId() 的类型为 Integer,不需要进行自动拆箱。

当您自动拆箱 null Integer 时,您会得到一个 NullPointerException(参见 Autoboxing),这就是您所遇到的.

要回答您的问题,这是正确的行为。

关于带有自动装箱的三元运算符中的Java NPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811608/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com