Java: eccezione puntatore null quando unboxing Integer?
-
06-07-2019 - |
Domanda
Questo codice sta causando un'eccezione puntatore null. Non ho idea del perché:
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);
}
}
}
L'ho esaminato nel debugger e tutte le variabili locali sono non nulle. In quale altro modo potrebbe accadere? La BiMap proviene da Google Collections.
Soluzione
L'eccezione del puntatore null è il risultato della decompressione del risultato di inverse.get(animal)
. Se inverse
non contiene la chiave animal
, restituisce null
, & Quot; di tipo & Quot; Integer
. Dato che l'assegnazione è a un int
riferimento, Java decomprime il valore in un inverse.containsKey(animal)
, risultando in un'eccezione puntatore null.
Dovresti controllare <=> o usare <=> come tipo di variabile locale per evitare unboxing e agire di conseguenza. Il meccanismo corretto dipende dal tuo contesto.
Altri suggerimenti
Cerca inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>
. L'inverso potrebbe non avere l'animale.
Devi avere uno stacktrace. Dice esattamente qual era la linea in cui è successo. Pubblicalo e possiamo dirlo.
Da tutto il codice pubblicato, posso " indovinare " uno di questi è un potenziale NullPointerException (NPE).
node
può essere nullo e chiamare node.getParent
.
Il genitore del nodo può essere nullo e invocare parent.getChildren
può generare un NPE.
Uno dei fratelli potrebbe essere nullo e invocare sibling.equals
potrebbe lanciare un NPE.
cellInfo potrebbe essere nullo e cellInfo.inverse
lo lancerà.
Finalmente " inverse " il reso potrebbe essere nullo e inverse.get()
lo lancerà.
Accidenti !! ...
Quindi, per evitare di fare queste ipotesi selvagge, perché non pubblichi semplicemente la tua stack stack e lo scopriamo?
Dovrebbe essere qualcosa del tipo:
java.lang.NullPointerException: null
at YourClass.setSiblings( YouClass.java:22 )
at YourClass.setSiblng( YourClass.java: XX )
ecc..