2015-04-03 93 views
0

我的代碼:爲什麼會拋出空指針異常?

static List<Object> data; 
private void addItem(List<Object> list) { 
    try { 
     data = new ArrayList<Object>(); 
     list.add("test"); 
    } catch (Exception e) { 
     e.printStackTrace();   
    } 
} 

public static void main(String[] args) { 
    ListTest test = new ListTest(); 
    test.addItem(data); 
} 

上面的代碼拋出NullPointerException。下面的代碼不會拋出NPE。

static List<Object> data = new Vector<Object>(); 
private void addItem(List<Object> list) { 
    try { 
     list.add("test"); 
    } catch (Exception e) { 
     e.printStackTrace();   
    } 
} 

public static void main(String[] args) { 
    ListTest test = new ListTest(); 
    test.addItem(data); 
} 

上面的代碼不會拋出NullPointerException。我不明白兩者的區別。

+1

在第一種情況下'static ... data'沒有被初始化,所以它得到了默認的'null'值,並且你得到了一個N​​PE。 – 2015-04-03 19:50:07

+0

因爲http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – chancea 2015-04-03 19:50:54

+0

NullPointerException - 在變量不正確後查找'.'或'[''組。 – 2015-04-03 19:54:23

回答

1

即使你通過data參考方法,那一刻你分配一個新的列表data:現在

data = new ArrayList<Object>(); 

listdata引用指向2個不同的對象。在該作業之前,data被設置爲null,因此list也被設置爲null。但在分配後,只有list設置爲null。因此撥打list.add()將導致NPE

在第二種情況下,data不是null開始。