2012-04-17 47 views
5

以下片段使用简单的Java代码。未知的Java中的NullPointerException

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类型的demonull:后其表达是demo.getValue()被执行,调用getValue()Demo类返回null内最后,它被转换为字符串并显示在控制台上。

但是,当我修改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。为什么?

+3

http://stackoverflow.com/questions/7811608/java-npe-in​​-ternary-operator-with-autoboxing – 2012-04-17 06:34:50

+0

可能重复[奇怪的Java NullPointerException与自动装箱](http://stackoverflow.com/questions/ 3265948 /奇怪-Java的NullPointerException异常与 - 自动装箱) – Pops 2012-04-30 17:25:11

回答

11

此语句:

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

实际上被转换成这样的:

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

的类型,条件表达式被确定为基于所述规则laid out in the JLS, section 15.25int(未Integer) ,使用binary numeric promotion (5.6.2)。从空引用到int的转换然后触发NullPointerException

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

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

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

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