1

次のようなクラスがあります。

package com.aci.golfgames;

import java.util.ArrayList;

public class Course {
    private String name;
    private int noOfTees;
    private ArrayList<Tee> tees;

    public Course(){
        // Build a course with some tees.
        name = "ABC Country Club";
        ArrayList<Tee> tees = new ArrayList<Tee>();
        tees.add(new Tee("White", 126, 70.4));
        tees.add(new Tee("Red", 128, 75.2));
        tees.add(new Tee("Blue", 126, 71.4));
        noOfTees = 3;
    }

    public String getCourseName(){
        return this.name;
    }
    public ArrayList<Tee> getTees(){
        return tees;
    }
    public int getNoOfTees(){
        return this.noOfTees;
    }
}

ArrayList フィールドteesをインスタンス化しようとすると、 Object Courseでフィールドとして宣言されたものとは異なる ArrayList を作成しているようです。IOW、this.teesはteesとは異なります。行を削除すると:

            ArrayList<Tee> tees = new ArrayList<Tee>();

ArrayList がインスタンス化されていないため、実行時にtees.add(...)で Null Pointer 例外が発生します。

ここで何が問題なのですか?ArrayList をインスタンス化するにはどうすればよいですか? 注: tee ArrayList のエントリ数はオブジェクトごとに変化するため、単なる配列ではなく ArrayList になります。ここのコードは、テスト用にコースを 1 つ定義するだけです。

ありがとう。

4

2 に答える 2

5
public Course(){
    ArrayList<Tee> tees = new ArrayList<Tee>();
}

する必要があります

public Course(){
    tees = new ArrayList<Tee>();
}

コンストラクター内で再度定義することにより、コンストラクター内のスコープをコンストラクターのみにArrayList<Tee>縮小しますが、他のメソッドはインスタンススコープでフィールドとして定義されたものを使用しています。teestees

そうです、実際にはコンストラクター内で使用される新しいリストを作成します。

于 2013-11-07T19:28:59.053 に答える
1

はい; ArrayList外部をシャドウしているコンストラクター内にローカルスコープを作成していますtee。あなたがする必要があります:

tees = new ArrayList<Tee>();

つまり、先行する を取り除きArrayList<Tee>ます。

のタイプのList<Tee>代わりにインターフェイスを使用することも検討してください。これにより、 と密結合していないため、後で実装を簡単に交換できます。ArrayList<Tee>teeArrayList

于 2013-11-07T19:30:32.467 に答える