一尘不染

尝试将新的Class实例添加到ArrayList时,while循环中出现NullPointerException

java

我在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);
      }
   }

阅读 248

收藏
2020-12-03

共1个答案

一尘不染

删除构造函数内部的List<Person>before people = …,否则,您将在构造函数内部声明一个新的局部变量people,使该
字段 成为阴影people(然后不再使用)。这使类字段未初始化(null),然后导致NPE。

相反,您想要初始化字段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
    }
}
2020-12-03