Java: excepción de puntero nulo al desempaquetar Integer?
-
06-07-2019 - |
Pregunta
Este código está causando una excepción de puntero nulo. No tengo idea de por qué:
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);
}
}
}
Lo he examinado en el depurador, y todas las variables locales no son nulas. ¿De qué otra forma podría estar pasando esto? BiMap es de Google Collections.
Solución
La excepción de puntero nulo es el resultado de desempaquetar el resultado de inverse.get(animal)
. Si inverse
no contiene la clave animal
, devuelve null
, & Quot; de tipo & Quot; Integer
. Dado que la asignación es a una referencia int
, Java desempaqueta el valor en un inverse.containsKey(animal)
, lo que resulta en una excepción de puntero nulo.
Debe verificar <=> o usar <=> como el tipo de variable local para evitar el desempaquetado y actuar en consecuencia. El mecanismo adecuado depende de su contexto.
Otros consejos
Verifique inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>
. El inverso podría no tener el animal.
Debes tener un stacktrace. Dice exactamente cuál fue la línea donde sucedió eso. Publícalo y podemos verlo.
De todo el código publicado, puedo " adivinar " uno de estos es una potencial NullPointerException (NPE).
node
puede ser nulo y llamar a node.getParent
.
El padre del nodo puede ser nulo e invocar parent.getChildren
puede arrojar un NPE.
Uno de los hermanos puede ser nulo e invocar sibling.equals
puede arrojar un NPE.
cellInfo puede ser nulo y cellInfo.inverse
lo arrojará.
Finalmente el " inverso " devuelto puede ser nulo y inverse.get()
lo arrojará.
¡Uf! ...
Entonces, para evitar hacer estas suposiciones salvajes, ¿por qué no publicas tu stacktrace y lo descubrimos?
Debería ser algo como:
java.lang.NullPointerException: null
at YourClass.setSiblings( YouClass.java:22 )
at YourClass.setSiblng( YourClass.java: XX )
etc. ..