2009-11-28 10 views
8

Este código está causando una excepción de puntero nulo. No tengo ni idea de por qué:Java: excepción de puntero nulo al desagrupar enteros?

private void setSiblings(PhylogenyTree node, Color color) throws InvalidCellNumberException { 
    PhylogenyTree parent = node.getParent(); 

    for (PhylogenyTree sibling : parent.getChildren()) { 
     if (! sibling.equals(node)) { 
      Animal animal = sibling.getAnimal(); 
      BiMap<PhylogenyTree, Integer> inverse = cellInfo.inverse(); 
      int cell = inverse.get(animal); // null pointer exception here 
      setCellColor(cell, color); 
     } 
    } 
} 

He examinado en el depurador, y todas las variables locales son no nulo. ¿De qué otra manera podría estar pasando esto? BiMap es de Google Collections.

+5

Bueno, él incluyó la línea en la que se lanzó la excepción. No creo que la stacktrace NullPointerException sea útil en este caso, además de apuntar la línea – notnoop

Respuesta

35

La excepción de puntero nulo es el resultado de unboxing el resultado de inverse.get(animal). Si inverse no contiene la clave animal, devuelve null, "del tipo" Integer. Dado que la asignación es una referencia int, Java unboxes el valor en int, lo que da como resultado una excepción de puntero nulo.

Debe verificar inverse.containsKey(animal) o utilizar Integer como el tipo de variable local para evitar el desempaquetado y actuar en consecuencia. El mecanismo adecuado depende de tu contexto.

0

Debe tener stacktrace. Dice exactamente cuál era la línea donde sucedió eso. Publicarlo y podemos decirlo.

De todo el código publicado puedo "supongo" uno de ellos son potenciales NullPointerException

nodo puede ser nulo y llamando node.getParent

El padre del nodo puede ser nulo e invocando parent.getChildren puede lanzar NPE

Uno de los hermanos puede ser nulo e invocando sibling.equals puede arrojar Npe

cellInfo puede ser nulo y cellInfo.inverse lo arrojará.

Finalmente, el "inverso" devuelto puede ser nulo y inverse.get() lo arrojará.

Uf !! ...

lo tanto, para evitar hacer esto guessings salvajes ¿por qué no se limite a publicar su StackTrace y nos damos cuenta?

Debería algo como:

java.lang.NullPointerException: null 
at YourClass.setSiblings(YouClass.java:22) 
at YourClass.setSiblng(YourClass.java: XX) 

etc ...

3

comprueba si hay una clave inversa (animal), BiMap puede no tener el animal.

Cuestiones relacionadas