2013-01-12 69 views
7

當向ArrayList添加項目時,我會遇到NullPointerException如果ArrayList未初始化爲字段。誰能解釋爲什麼?Java:在字段OR構造函數中初始化ArrayList?

工程時,我初始化的ArrayList作爲一個字段:

public class GroceryBill { 

private String clerkName; 
private ArrayList<Item> itemsInGroceryList = new ArrayList<Item>(); 

private double total; 

//Constructs a grocery bill object for the given clerk 
public GroceryBill(Employee Clerk) { 

    this.clerkName = Clerk.getEmployeeName(); 
    this.total = 0.0; 

} 

public void add(Item i) { 

    itemsInGroceryList.add(i); 
} 

} 

當我宣佈ArrayList中作爲一個字段不工作,然後在類的構造函數初始化:

public class GroceryBill { 

private String clerkName; 
private ArrayList<Item> itemsInGroceryList; 

private double total; 

//Constructs a grocery bill object for the given clerk 
public GroceryBill(Employee Clerk) { 

    this.clerkName = Clerk.getEmployeeName(); 
    this.total = 0.0; 
    ArrayList<Item> itemsInGroceryList = new ArrayList<Item>(); 

} 

public void add(Item i) { 

    itemsInGroceryList.add(i); 
} 

} 
+1

時做到這一點聲明實例變量本身,還有什麼可以讓它成爲'final',因爲你永遠不會覆蓋它。 – fge

回答

11

因爲版本在構造函數中創建一個新變量,該變量正好與您的成員字段命名相同,並且成員字段保持未設置狀態。這就是所謂的變量陰影,其中新創建的變量是遮蔽/隱藏成員字段。

你需要那麼你引用的成員變量在構造函數中擺脫該類型聲明:

public GroceryBill(Employee Clerk) { 
    itemsInGroceryList = new ArrayList<Item>(); 
} 

你甚至可以是明確的,並使用this

public GroceryBill(Employee Clerk) { 
    this.itemsInGroceryList = new ArrayList<Item>(); 
} 
+4

+1 - 用於標識這是陰影(不是*「mak [變量]的本地副本」*,從術語的角度來看這是無意義的) –

相關問題