Java:在字段OR构造函数中初始化ArrayList?

将项添加到ArrayList时,如果ArrayList未初始化为字段,则会收到NullPointerException。 有人可以解释为什么吗

将ArrayList初始化为字段时的工作原理:

public class GroceryBill { private String clerkName; private ArrayList itemsInGroceryList = new ArrayList(); 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 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 itemsInGroceryList = new ArrayList(); } public void add(Item i) { itemsInGroceryList.add(i); } } 

因为构造函数中的版本正在创建一个恰好与您的成员字段命名相同的新变量,并且成员字段仍未设置。 这称为变量阴影,其中新创建的变量是阴影/隐藏成员字段。

您需要摆脱构造函数中的类型声明,以便引用成员变量:

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

你甚至可以明确地使用this

 public GroceryBill(Employee Clerk) { this.itemsInGroceryList = new ArrayList(); }