5

以下代码段使用简单的 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()));
    }
}

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

在下面的return声明中,

return demo==null?new Integer(1):demo.getValue();

由于demo类型Demonot null的对象,其后的表达式被执行,该表达式在:返回的内部类中demo.getValue()调用,最后,它被转换为 String 并显示在控制台上。getValue()Demonull

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

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

它抛出NullPointerException。如何?


我的意思是当我使用这个return语句时

return demo==null?new Integer(1):demo.getValue();

它有效(不抛出NullPointerException

当我使用以下类似 return的语句时

return demo==null?1:demo.getValue();

它导致NullPointerException. 为什么?

4

2 回答 2

11

这个说法:

return demo==null?1:demo.getValue();

实际上正在被转换成这样的东西:

int tmp = demo == null ? 1 : demo.getValue().intValue();
return (Integer) tmp;

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

于 2012-04-17T06:34:33.073 回答
3
return demo==null?new Integer(1):demo.getValue();

在这种情况下,表达式的类型是整数,而 null 是合法值。

return demo==null?1:demo.getValue();

在这种情况下,表达式的类型是 int,因此您的 Integer 返回值会自动取消装箱。因为它是空的,所以它会抛出一个 NPE。

于 2012-04-17T06:35:20.103 回答