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>();

上記のステートメントは、コンストラクター内に 2 つのローカル リスト参照を作成し、スコープがそれに限定され、それらを初期化します。したがって、実際には として宣言されたリスト参照を初期化していませんinstance variable

で使用されるlist参照は、まだ初期化されていないDeliveryLog.addOrder()として宣言されたものです。instance variables

コンストラクターでの上記の 2 つの初期化を次のように変更します。

waitingList = new ArrayList<Order>();
deliveredList = new ArrayList<Order>();
于 2012-11-24T11:57:56.237 に答える
2

コンストラクターで、waitingList と deliveryList を再宣言しました。

コンストラクターを次のように変更する必要があります。

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とという名前の2 つのローカル変数を作成し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 に答える