2012-11-24 98 views
1

當我嘗試添加和順序(先前已與Order類創建)爲waitingList我得到這個錯誤:Java代碼想出錯誤

java.lang.NullPointerException 
    at DeliveryLog.addOrder(DeliveryLog.java:41) 

我使用BlueJ的寫我的Java代碼。

下面是代碼:

import java.util.*; 
/** 
* Write a description of class DeliveryLog here. 
* 
* @author Stefan Lazic 
* @version 1 
*/ 
public class DeliveryLog 
{ 
    private Date logDate; 
    private int numberOfOrders; 
    private ArrayList<Order> waitingList; 
    private ArrayList<Order> deliveredList; 

/** constructor 
* @param dd day 
* @param mm month 
* @param yy year 
*/ 
public DeliveryLog(int dd, int mm, int yy) 
{ 
    //Initialses the log date and sets the default order value to 0 
    logDate = new Date (dd,mm,yy); 
    numberOfOrders = 0; 
    ArrayList<Order> waitingList = new ArrayList<Order>(); 
    ArrayList<Order> deliveredList = new ArrayList<Order>(); 
} 

public int getCallIns(int dd, int mm , int yy) 
{ 
    return numberOfOrders; 
} 

public int getOrdersWaiting() 
{ 
    return waitingList.size(); 
} 

public void addOrder (Order order) 
{ 
    waitingList.add(order); 

} 

} 

回答

4

你已重新宣佈在構造函數列表的引用: -

ArrayList<Order> waitingList = new ArrayList<Order>(); 
ArrayList<Order> deliveredList = new ArrayList<Order>(); 

上述語句在構造函數中,其範圍兩個本地列表的引用僅限於它,並初始化它們。所以,它實際上並沒有初始化聲明爲instance variable的列表引用。

現在在DeliveryLog.addOrder()中使用的list參考號是instance variables,它們仍未初始化。

更改上述兩個初始化在構造函數: -

waitingList = new ArrayList<Order>(); 
deliveredList = new ArrayList<Order>(); 
2

更改此:

ArrayList<Order> waitingList = new ArrayList<Order>(); 
ArrayList<Order> deliveredList = new ArrayList<Order>(); 

要這樣:

waitingList = new ArrayList<Order>(); 
deliveredList = new ArrayList<Order>(); 

你正在創建兩個局部變量稱爲waitingListdeliveredList ,它會影響同名的屬性 - 所以你正在初始化本地數組列表,而不是預期的屬性,並且屬性本身仍然是null,這導致了NPE。

1

您在DeliveryLog方法中使用的變量不是在類中聲明的變量。因此,在類中聲明的變量「waitingList」仍然未初始化。更改:

ArrayList<Order> waitingList = new ArrayList<Order>(); 
ArrayList<Order> deliveredList = new ArrayList<Order>(); 

waitingList = new ArrayList<Order>(); 
deliveredList = new ArrayList<Order>(); 

的方法,你應該是不錯的。

2

在您的構造函數中,您重新聲明瞭waitingList和deliveredList。

你應該改變你的構造看起來像這樣:

public DeliveryLog(int dd, int mm, int yy) 
{ 
    //Initialses the log date and sets the default order value to 0 
    logDate = new Date (dd,mm,yy); 
    numberOfOrders = 0; 
    this.waitingList = new ArrayList<Order>(); 
    this.deliveredList = new ArrayList<Order>(); 
} 

否則,你的實例變量waitingList和deliveredList將保持未初始化,當你調用addOrder方法,它會拋出一個NullPointerException。