2013-01-12 13 views
7

Otrzymuję wyjątek NullPointerException podczas dodawania elementu do tablicy ArrayList, jeśli nie jest zainicjowana tablica ArrayList jako pole. Czy ktoś może wyjaśnić, dlaczego?Java: Inicjalizuj ArrayList w polu OR konstruktora?

WORKS kiedy zainicjować ArrayList jako pole:

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

} 

nie działa, gdy Oświadczam ArrayList jako pole następnie zainicjować w konstruktorze klasy:

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

Zrób to kiedy deklarując samą zmienną instancji, a co więcej możesz ją ustawić jako 'final', ponieważ nigdy jej nie zastępujesz. – fge

Odpowiedz

11

Ponieważ wersja w konstruktorze tworzy nową zmienną, która akurat nazywa się tak samo jak pole członka, a pole elementu nie zostaje ustawione. Jest to tak zwane zmienne cieniowanie, w którym nowo utworzona zmienna polega na zacieniowaniu/ukryciu pola elementu.

Musisz pozbyć deklaracji typu w konstruktorze więc jesteś odwołanie do zmiennej użytkownika:

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

Można nawet być jawne i korzystania this:

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

+1 - za zidentyfikowanie, że to jest shadowing (nie * "tworzenie [lokalnej] kopii zmiennej" * co jest bezsensowne z terminologicznego punktu widzenia ...) –