具有自动装箱功能的三元运算符中的Java NPE?

Kev*_*vin 20 java nullpointerexception

今天早上我遇到了一个非常奇怪的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()));
    }   
}
Run Code Online (Sandbox Code Playgroud)

编译和运行的输出:

$ javac Test1.java 
$ java Test1
Exception in thread "main" java.lang.NullPointerException
at Test1.f(Test1.java:12)
at Test1.main(Test1.java:16)
$
Run Code Online (Sandbox Code Playgroud)

Jac*_*nds 32

类型表达的item == null ? 1 : item.getId()intInteger.因此,Java需要自动拆箱你Integerint(导致NullPointerException).然后它自动将结果返回到一个Integer(如果不是这样的NullPointerException),从方法返回.

另一方面,表达式item == null ? new Integer(1) : item.getId()具有一种类型,Integer并且不需要进行自动拆箱.

当您自动取消装箱a时null Integer,您会得到一个NullPointerException(请参阅自动装箱),这就是您所遇到的问题.

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