【问题标题】:Java issues with ArrayListArrayList 的 Java 问题
【发布时间】:2009-12-03 06:50:30
【问题描述】:

我有一个包含两个数组列表的类,我试图将对象存储到其中,每个对象类型一个。在我的主类中,我像这样插入对象:

 for (int i =0; i < 3; i++)
 {
     Cat cat = new Cat("meow",i);
     Dog dog = new Dog("woof",i);
     objList.addCat(cat);
     objList.addDog(dog);
 }

我的 ObjectList (objList) 类的设置如下:

import java.util.ArrayList;

public class ObjectList {
    public ArrayList  cats;
    public ArrayList  dogs;

    public ObjectList()
    {
        this.cats   = new ArrayList();
        this.dogs   = new ArrayList();
    }

    public void addCat(Cat c)
    {
        this.cats.add(c);
    }

    public void addDog(Dog d)
    {
        this.dogs.add(d);
    }
}

但是,我从objList.addCat(cat); 行开始得到java.lang.NullPointerException。我在这一行之前打印出了 cat 对象的属性,这两个值似乎都已设置。我试图查看是否可以将一个 int 传递给我的 addCat arrayList,但我得到了同样的错误,所以我假设我在我的类中错误地使用了 arraylist。我的代码中是否存在显而易见的错误?

【问题讨论】:

  • 每当您询问与异常相关的问题时,请不要忘记包含堆栈跟踪。

标签: java arraylist


【解决方案1】:

我建议的几件事:

  1. 不要公开您的字段;
  2. 尽可能使用接口(List 而不是 ArrayList);
  3. 支持immutability,或者如果您不打算更改数据成员,至少将它们设为最终成员;和
  4. (与此无关)采用 Java 代码约定。

所以试试这个:

public class ObjectList {
  private final List cats;
  private final List dogs; 

  public ObjectList() {   
    cats = new ArrayList();
    dogs = new ArrayList();
  }

  public void addCat(Cat c) {
    cats.add(c);
  }

  public void addDog(Dog d) {
    dogs.add(d);
  }
}

这应该避免任何可能发生的外部变化。或者,更好的是,使用泛型:

public class ObjectList {
  private final List<Cat> cats;
  private final List<Dog> dogs; 

  public ObjectList() {   
    cats = new ArrayList<Cat>();
    dogs = new ArrayList<Dog>();
  }

  public void addCat(Cat c) {
    cats.add(c);
  }

  public void addDog(Dog d) {
    dogs.add(d);
  }
}

你正在初始化你的对象列表实例吗?

ObjectList objList = new ObjectList();
for (int i=0; i<3; i++)  {
  Cat cat = new Cat("meow",i);
  Dog dog = new Dog("woof",i);
  objList.addCat(cat);
  objList.addDog(dog);
}

【讨论】:

  • 谢谢。这行得通。我正在使用 processing.core 库,并在处理设置函数中初始化我的 ObjectList 对象(这是我的主类的属性)。我认为它可以通过这种方式在全球范围内访问,但它似乎不起作用。但是,无论如何,在循环之前初始化 ObjectList 更有意义。感谢您的代码和建议。
  • 更完整的答案。 +1
【解决方案2】:

你在使用 objList 之前是否对其进行了初始化?

ObjectList objList = new ObjectList();

(在循环之前)

【讨论】:

  • @cletus:哪个构造函数?我说的不是ArrayList(在ObjectList的构造函数中初始化),而是ObjectList的实例
猜你喜欢
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多