Проблемы с Java с ArrayList - PullRequest
       27

Проблемы с Java с ArrayList

1 голос
/ 03 декабря 2009

У меня есть класс, который содержит два массива, в которые я пытаюсь сохранить объекты, по одному для каждого типа объекта. В моем основном классе я вставляю объекты так:

 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 ]

6 голосов
/ 03 декабря 2009

Несколько вещей, которые я бы предложил:

  1. Не делайте свои поля общедоступными;
  2. Используйте интерфейсы, где это возможно (Список вместо ArrayList);
  3. Пользуйтесь неизменяемостью или, по крайней мере, сделайте ваши элементы данных окончательными, если вы не собираетесь их менять; и
  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);
}
3 голосов
/ 03 декабря 2009

Вы инициализировали свой objList перед его использованием?

ObjectList objList = new ObjectList();

(перед выполнением цикла)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...