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 不同的 ArrayList 。IOW,this.teestees不同。如果我删除该行:

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

我在tees.add(...)运行时收到空指针异常,我假设是因为 ArrayList 尚未实例化。

这里有什么问题?如何实例化 ArrayList?注意:tees ArrayList 中的条目数会因对象而异,因此 ArrayList 而不仅仅是一个数组。这里的代码只是定义一门课程进行测试。

谢谢。

4

2 回答 2

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

应该

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

通过在构造函数中再次将其定义为ArrayList<Tee>,您将构造函数中的范围缩小为tees仅构造函数,而其他方法正在使用tees定义为实例范围内的字段。

所以是的,它实际上会创建一个将在构造函数中使用的新列表。

于 2013-11-07T19:28:59.053 回答
1

是的; 您正在ArrayList构造函数内部创建一个局部范围的遮蔽外部的tee. 你需要做:

tees = new ArrayList<Tee>();

也就是去掉前面的ArrayList<Tee>.

还可以考虑使用接口List<Tee>而不是 ;ArrayList<Tee>的类型tee。由于您没有与ArrayList.

于 2013-11-07T19:30:32.467 回答