2013-01-12 10 views
7

Ich erhalte eine NullPointerException beim Hinzufügen eines Elements zu einer ArrayList, wenn die ArrayList nicht als Feld initialisiert ist. Kann mir jemand erklären warum?Java: ArrayList in Feld ODER Konstruktor initialisieren?

funktioniert, wenn ich die Arraylist als ein Feld initialisieren:

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

} 

funktioniert nicht, wenn ich die Arraylist als ein Feld deklarieren dann in der Klasse Konstruktor initialisieren:

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

dies tun, wenn Deklarieren der Instanzvariable selbst, und was noch mehr ist, können Sie "final" machen, da Sie sie niemals überschreiben. – fge

Antwort

11

Da die Version Im Konstruktor wird eine neue Variable erstellt, die zufälligerweise genauso benannt wird wie Ihr Member-Feld. Das Member-Feld bleibt nicht gesetzt. Dies wird als Variable Shadowing bezeichnet, bei der die neu erstellte Variable das Member-Feld überschattet.

Sie benötigen die Typdeklaration im Konstruktor, um loszuwerden, so dass Sie die Membervariable sind Referenzierung:

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

Sie können sogar explizit sein und verwenden this:

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

+1 - um zu erkennen, dass es sich um ein Shadowing handelt (nicht um eine lokale Kopie der Variablen zu erstellen *, was aus terminologischer Sicht unsinnig ist ...) –

Verwandte Themen