Java中的Unknown NullPointerException

Lio*_*ion 5 java

以下代码段使用简单的Java代码.

package pkg;

final public class Main
{
    final private class Demo
    {
        private Integer value = null;

        public Integer getValue()
        {
            return value;
        }
    }

    private Integer operations()
    {
        Demo demo = new Demo();
        return demo==null?new Integer(1):demo.getValue();
    }

    public static void main(String[] args)
    {
        Main main=new Main();
        System.out.println("Value = " + String.valueOf(main.operations()));
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码按预期工作,没有问题,并Value = null在控制台上显示.

在以下return声明中,

return demo==null?new Integer(1):demo.getValue();
Run Code Online (Sandbox Code Playgroud)

由于对象demo类型的Demo null,表达后:,其demo.getValue()被执行,调用getValue()所述内内Demo返回类null,最后,它被转换为字符串,并在控制台上显示.

但是当我修改operations()方法时,如下所示,

private Integer operations()
{
    Demo demo = new Demo();    
    return demo==null?1:demo.getValue();
}
Run Code Online (Sandbox Code Playgroud)

它抛出NullPointerException.怎么样?


我的意思是当我使用这个return陈述时

return demo==null?new Integer(1):demo.getValue();
Run Code Online (Sandbox Code Playgroud)

它工作(不扔NullPointerException)

而当我使用以下类似的 return声明

return demo==null?1:demo.getValue();
Run Code Online (Sandbox Code Playgroud)

它导致NullPointerException.为什么?

Jon*_*eet 11

这个说法:

return demo==null?1:demo.getValue();
Run Code Online (Sandbox Code Playgroud)

实际上是转换成这样的东西:

int tmp = demo == null ? 1 : demo.getValue().intValue();
return (Integer) tmp;
Run Code Online (Sandbox Code Playgroud)

根据JLS第15.25节中规定的规则,使用二进制数字提升(5.6.2)确定条件表达式的类型int(不).从空引用转换为然后触发.IntegerintNullPointerException