Java: Null-Zeiger-Ausnahme, wenn Unboxing Integer?
-
06-07-2019 - |
Frage
Dieser Code verursacht eine Null-Zeiger-Ausnahme. Ich habe keine Ahnung, warum:
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);
}
}
}
Ich habe es im Debugger untersucht, und alle lokalen Variablen sind nicht null. Wie sonst könnte dies geschehen? Die bimap ist von Google-Sammlungen.
Lösung
Die Null-Zeiger-Ausnahme ist das Ergebnis des Ergebnis der inverse.get(animal)
Unboxing. Wenn inverse
enthält nicht den Schlüssel animal
, gibt es null
, „vom Typ“ Integer
. Da die Zuordnung zu einer int
Referenz, unboxes Java den Wert in einem int
, in einem Null-Zeiger-Ausnahme führt.
Sie sollten entweder prüfen inverse.containsKey(animal)
oder Integer
als lokalen Variablentyp verwenden zu vermeiden Unboxing und entsprechend handeln. Der richtige Mechanismus hängt von Ihrem Kontext.
Andere Tipps
Nach inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>
. Die inverse vielleicht nicht das Tier hat.
Sie müssen einen Stacktrace haben. Es sagt genau das, was war die Linie, wo das passiert ist. Post-It und wir können sagen.
Von all dem entsandten Code, kann ich "erraten" eine davon ist eine mögliche Nullpointer (NPE).
node
kann null und ruft node.getParent
.
Die Eltern Knoten null sein kann und parent.getChildren
Aufruf kann eine NPE werfen.
Eines der Geschwister null sein kann und sibling.equals
Aufruf kann eine NPE werfen.
Cell null sein kann und cellInfo.inverse
wird es werfen.
Schließlich wird die "inverse" zurück kann null sein und inverse.get()
wird es werfen.
Puh !! ...
Also, um zu vermeiden, diese wild guessings tun, warum schreiben Sie nicht nur Ihre Stacktrace und wir wissen?
Es sollte so etwas wie:
java.lang.NullPointerException: null
at YourClass.setSiblings( YouClass.java:22 )
at YourClass.setSiblng( YourClass.java: XX )
etc ...