我有一个课程如下:
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>();
我在运行时在 tees.add(...)处得到Null指针异常,我假设因为ArrayList尚未实例化。
这里有什么问题?如何实例化ArrayList?注意: tees ArrayList中的条目数将从一个对象更改为另一个对象,因此ArrayList而不仅仅是一个数组。这里的代码只是定义一个课程进行测试。
感谢。
答案 0 :(得分:5)
public Course(){
ArrayList<Tee> tees = new ArrayList<Tee>();
}
应该是
public Course(){
tees = new ArrayList<Tee>();
}
通过在构造函数中再次将其定义为ArrayList<Tee>
,您只将构造函数中tees
的范围缩小为构造函数,而其他方法使用的是tees
定义为实例范围内的字段。
所以是的,它实际上会创建一个将在构造函数中使用的新列表。
答案 1 :(得分:1)
是;您正在构造函数内部创建一个本地作用域ArrayList
,该外观tee
正在遮蔽外部tees = new ArrayList<Tee>();
。你需要这样做:
ArrayList<Tee>
即,摆脱前面的List<Tee>
。
另请考虑使用ArrayList<Tee>
接口而不是tee
作为ArrayList
的类型;这将使您以后更容易交换实现,因为您没有与{{1}}紧密耦合。