2013-01-12 25 views
7

Tôi nhận được một NullPointerException khi thêm một mục vào một ArrayList IF ArrayList không được khởi tạo như một trường. Bất cứ ai có thể giải thích lý do tại sao?Java: Khởi tạo ArrayList trong trường OR constructor?

TRÌNH khi tôi khởi tạo ArrayList là một lĩnh vực:

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); 
} 

} 

không hoạt động khi tôi tuyên bố ArrayList là một lĩnh vực sau đó khởi tạo nó trong các nhà xây dựng Class:

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

Làm điều này khi tự khai báo biến cá thể, và bạn có thể làm gì hơn là 'final', vì bạn không bao giờ ghi đè lên nó. – fge

Trả lời

11

Bởi vì phiên bản trong hàm tạo đang tạo một biến mới chỉ xảy ra được đặt tên giống như trường thành viên của bạn và trường thành viên vẫn chưa được đặt. Điều này được gọi là biến đổ bóng, trong đó biến mới được tạo ra là che khuất/ẩn trường thành viên.

Bạn cần phải thoát khỏi việc kê khai loại trong các nhà xây dựng, do đó bạn đang tham khảo các biến thành viên:

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

Bạn thậm chí có thể rõ ràng và sử dụng this:

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

+1 - để xác định rằng đây là shadowing (không * "mak [ing] một bản sao cục bộ của biến" * đó là vô nghĩa từ một điểm thuật ngữ xem ...) –

Các vấn đề liên quan