2009-12-03 3 views
1

객체를 저장하려고하는 두 개의 arraylists가 각 객체 유형마다 하나씩 포함 된 클래스가 있습니다. 내 메인 클래스에서, 내가 지금 같은 개체를 삽입 해요 : 내가 그러나 objList.addCat(cat); 줄에서 시작하는 java.lang.NullPointerException를 얻을 수ArrayList를 사용한 자바 문제

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

:

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) 클래스는 같은 설정이다. 나는이 줄 바로 앞에서 cat 객체 속성을 출력했고, 두 값이 설정되어있는 것으로 보인다. 나는 단지 addCat arrayList에 int를 전달할 수 있는지 알아보기 위해 노력했지만 동일한 오류가 발생했기 때문에 클래스 내에서 arraylist를 잘못 사용한다고 가정합니다. 쉽게 볼 수있는 코드에 오류가 있습니까?

+0

예외와 관련하여 질문 할 때마다 스택 추적을 포함시켜주십시오. –

답변

6

일의 커플 내가 좋을 것 :

  1. 당신의 필드는 공개하지 마십시오
  2. 가능하면 인터페이스를 사용하십시오 (ArrayList 대신 List).
  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); 
} 
+0

감사합니다. 이것은 효과가 있었다. processing.core 라이브러리를 사용하고 처리 설정 기능 내에서 ObjectList 객체 (내 주 클래스의 속성)를 초기화하고있었습니다. 전 세계적으로이 방법으로 접근 할 수있을 것이라고 생각했지만 작동하지 않았습니다. 그러나, 루프 전에 ObjectList를 초기화하는 것이 어쨌든 더 의미가 있습니다. 코드 및 조언에 감사드립니다. – minimalpop

+0

훨씬 더 완전한 대답. +1 – VonC

3

objList를 사용하기 전에 초기화 했습니까?

ObjectList objList = new ObjectList(); 

(루프를하기 전에)

+1

@cletus : 어떤 생성자입니까? 나는'ObjectList'의 생성자로 초기화 된'ArrayList'에 대해서가 아니라'ObjectList'의 인스턴스에 대해서 말하고 있습니다. – VonC