当我尝试添加和订购(之前已使用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);
}
}
答案 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>();
您正在创建两个名为waitingList
和deliveredList
的局部变量,这些变量会影响同名的属性 - 因此您要初始化本地数组列表,而不是预期的属性,以及属性本身保持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>();
在方法中你应该很好。