我在Google上搜索的次数越多,我就会越来越困惑。
我从CSV导入了一个长度未知的名称列表以及其他一些详细信息,然后我需要将其转换为Person对象并将其存储在名为people的列表中,该列表是该类Club的实例变量,它的列表成员基本上。
这是非常复杂的事情的非常简化的版本,我需要在while中循环遍历文件,为每行创建对象,然后将其添加到列表集合中。
但是,当我运行代码时,我一直收到nullPointerException错误,但我很困惑如何避免它。我猜想我在创建新对象时需要在每个循环上更改变量p,但是我认为不可能动态更改变量吗?
想不出每次如何使用有效的非null引用将对象提交到集合。非常感谢您的帮助。我试图在下面的代码中删除所有不必要的内容。
谢谢
//class arraylist instance variable of class "Club" private ArrayList<Person> people; //class constructor for Club public Club() {List<Person> people = new ArrayList<>();} public void readInClubMembers() { //some variables concerning the file input String currentLine; String name; String ageGroup; while (bufferedScanner.hasNextLine()) { //some lines bringing in the scanner input from the file name = lineScanner.next(); ageGroup = "young"; Person p = new Person(); // i guess things are going wrong around here people.add(p); p.setName(name); p.setAgeGroup(ageGroup); } }
删除构造函数内部的List<Person>before people = …,否则,您将在构造函数内部声明一个新的局部变量people,使该 字段 成为阴影people(然后不再使用)。这使类字段未初始化(null),然后导致NPE。
List<Person>
people = …
people
null
相反,您想要初始化字段people:
public Club() { // you can also use "this.people = …" to be explicit people = new ArrayList<>(); }
要显示差异:
class Example { private int myNumber; public Example() { myNumber = 42; // sets the field of the class int myNumber = 1337; // declares a new local variable shadowing the class field myNumber = -13; // accesses the object in the closest scope which is the local variable this.myNumber = 0; // explicitly accesses the class field } }