2012-04-05 13 views
7

Esto está en Java, multiplataforma y se depura en una computadora que ejecuta Ubuntu Oneric con OpenJDK instalado como mi tiempo de ejecución.Java - EnumSet.add (enum), throws NullPointerException

Tengo un EnumSet para verificar dentro de una clase en un juego en el que estoy trabajando. Tengo esta lectura de logcat, de depuración en abundancia en mi constructor:

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) 
    ... 

No es divertido. Seguimiento hacia abajo, mi problema parece ser, en su totalidad, esta línea:

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

Por lo cual quiero decir que el cuerpo de la función. Se llama desde el constructor como:

this.addPassability(Passability.AIR); 

Cuando ocurre la excepción NullPointerException. En el cuerpo de la transitabilidad Enum Tipo, tengo

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

como, literalmente, toda la enumeración guardar declaración del paquete. this.passability se declara

private EnumSet <Passability> passability; 

al comienzo de la definición de clase y yo estaba bajo la impresión de que el método add() se hereda como parte de la definición de EnumSet en la Norma de Java.

Soy autodidacta, pero no estoy loco. O tengo algo mal o hay una mejor manera de hacer esto. ¿Alguien con algún conocimiento útil por ahí capaz de echar una mano?

+0

podría mostrar más trozos de su código. Todo lo que veo es una línea aquí y allá. – Adrian

+0

Jon Skeet lo tiene. Nunca lo inicialicé porque estoy tan acostumbrado a solo usar primitivos ~ Intento BESAR mi trabajo porque mantiene las cosas en su sano juicio. –

Respuesta

16

por lo que ha declarado la variable passability, pero usted ha mostrado ningún signo de que se le asigne un valor distinto del valor por defecto de null. Tal vez quisiste decir:

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

Un EnumSet es un objeto, como cualquier otro - por lo menos que dar explícitamente la variable, tendrá el valor por defecto de null y cuando se llama add en ella, obtendrá una NullPointerException - que es exactamente lo que sucedió aquí.

+0

Sí señor, eso funciona bien. Sin embargo, tengo cierta preocupación sobre esa nota. En este momento, eso se ha agregado a la declaración de campo ~ ¿está _really_ seguro allí, o debería moverlo a mi llamada de constructor? Es decir, 'privada EnumSet transitabilidad;' hasta arriba y 'this.passability = EnumSet.noneOf (Passability.class);' en el cuerpo del constructor? –

+2

@ThatGuy: Está bien. Son bastante equivalentes. –

Cuestiones relacionadas