1

当我尝试添加和订购(之前已使用 Order 类创建)时,waitingList我收到此错误:

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

4 回答 4

4

您已在构造函数中重新声明了列表引用:-

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

上述语句在构造函数中创建了两个本地列表引用,其作用域仅限于此,并对其进行初始化。因此,它实际上并没有初始化声明为instance variable.

现在,list中使用的引用DeliveryLog.addOrder()是声明为instance variables仍未初始化的引用。

将构造函数中的上述两个初始化更改为:-

waitingList = new ArrayList<Order>();
deliveredList = new ArrayList<Order>();
于 2012-11-24T11:57:56.237 回答
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。

于 2012-11-24T12:05:12.060 回答
2

改变这个:

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

对此:

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

waitingList您正在创建两个名为and的局部变量deliveredList,它们隐藏了同名的属性 - 因此您正在初始化本地数组列表,而不是预期的属性,并且属性本身保持不变null,这会导致 NPE。

于 2012-11-24T11:58:22.483 回答
1

您在 DeliveryLog 方法中使用的变量不是您在类中声明的变量。因此,在类中声明的变量“waitingList”保持未初始化。改变:

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

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

在方法上,你应该很好。

于 2012-11-24T11:59:39.490 回答