2012-11-24 103 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。