2012-04-17 46 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。