Java问题与ArrayList有关

时间:2009-12-03 06:50:30

标签: java arraylist

我有一个包含两个arraylists的类,我正在尝试将对象存储到每个对象类型中。在我的主类中,我正在插入这样的对象:

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

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

2 个答案:

答案 0 :(得分:6)

我建议的一些事情:

  1. 不要公开您的字段;
  2. 尽可能使用接口(List而不是ArrayList);
  3. 如果您不想更改数据,请至少使immutability或至少使您的数据成员成为最终成员;和
  4. (与此无关)采用Java代码约定。
  5. 所以试试这个:

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

答案 1 :(得分:3)

在使用之前是否初始化了objList?

ObjectList objList = new ObjectList();

(在做循环之前)