Java代码出现错误

时间:2012-11-24 11:56:38

标签: java list constructor arraylist nullpointerexception

当我尝试添加和订购(之前已使用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 个答案:

答案 0 :(得分: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>();

答案 1 :(得分:2)

改变这个:

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

对此:

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

您正在创建两个名为waitingListdeliveredList的局部变量,这些变量会影响同名的属性 - 因此您要初始化本地数组列表,而不是预期的属性,以及属性本身保持null,这会导致NPE。

答案 2 :(得分: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。

答案 3 :(得分:1)

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

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

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

在方法中你应该很好。