2012-04-05 5 views
7

이것은 Java로, 크로스 플랫폼이며 OpenJDK가 설치된 Ubuntu Oneric을 실행하는 컴퓨터에서 디버깅 중입니다.Java - EnumSet.add (enum), NullPointerException을 throw합니다.

저는 작업중인 게임에서 클래스 내부를 확인하기위한 EnumSet을 보유하고 있습니다. 나는 디버그 많이에서 내 생성자에서, 로그 캣에서이 판독이 : 좋지

Tile : passability being set...? 
Exception in thread "Thread-1" javax.media.opengl.GLException:java.lang.NullPointerException 
    ... 
Caused by: java.lang.NullPointerException 
    at net.darkglass.map.Tile.addPassability(Tile.java:144) 
    ... 

합니다. 그것을 추적, 내 문제는 전적으로,이 줄을 것 같습니다 :

public void addPassability(Passability type) 
{ 
    this.passability.add(type); 
} 

나는 그 기능의 본문을 의미합니다. 다음과 같이 생성자에서 호출됩니다.

this.addPassability(Passability.AIR); 

NullPointerException이 발생합니다. Passability Enum Type의 본문에서 나는 문자 그대로 전체 enum 저장 패키지 선언을 그대로 사용하여

public enum Passability 
{ 
    AIR, ALL, GROUND, NONE, SIGHT, SKILL, STRUCTURE, WATER; 
} 

을 가지고 있습니다. this.passability 클래스 정의의 시작 부분에

private EnumSet <Passability> passability; 

을 선언하고 나는 추가() 메소드는 자바 표준에서 각각 EnumSet의 정의의 한 부분으로 상속하는 인상이었다.

나는 독학하지만, 나는 미치지 않습니다. 뭔가 잘못되었거나 더 나은 방법이 있습니다. 핸드를 빌려줄 수있는 유용한 지식을 가진 사람?

+0

코드 조각을 더 많이 표시 할 수 있습니까? 여기 저기에 선이 보이면 모두보아야합니다. – Adrian

+0

Jon Skeet 있습니다. 프리미엄을 사용하는 데 너무 익숙해 져서 결코 초기화하지 않았습니다. 일을 제정신으로 유지하기 때문에 키스를하려고합니다. –

답변

16

그래서 당신은 passability 변수 선언했지만, null의 디폴트 값 이외의 값을 할당되는 당신은 그것의 흔적을 보여주지했습니다. 아마도 당신은 의미 : - 당신이 명시 적으로 변수를 제공하지 않는 한, 그래서 그것은 null의 기본 값을 갖게됩니다 당신이 그것을에 add를 호출 할 때, 당신이를 얻을 수 있습니다

private EnumSet<Passability> passability = EnumSet.noneOf(Passability.class); 

EnumSet을 다른 같은 객체이며, NullPointerException - 정확히 무슨 일이 일어 났습니까?

+0

예, 괜찮습니다. 그러나, 나는 그 메모에 약간의 관심이있다. 지금 당장 필드 선언에 추가되었습니다 ~ 거기에서 안전합니까? 아니면 생성자 호출로 옮겨야합니까? 인 , '개인 각각 EnumSet passability;' 까지 위와 'this.passability = EnumSet.noneOf (Passability.class) 생성자 본문에서' ? –

+2

@ThatGuy : 괜찮습니다. 그것들은 꽤 비슷합니다. –

관련 문제