今天早晨,我遇到了一个非常奇怪的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),这就是您所遇到的。

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

10-06 04:59
查看更多