Java:исключение нулевого указателя при распаковке целого числа?
-
06-07-2019 - |
Вопрос
Этот код вызывает исключение с нулевым указателем.Я понятия не имею, почему:
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);
}
}
}
Я проверил это в отладчике, и все локальные переменные не равны нулю.Как еще это могло произойти?БиМап взят из коллекций Google.
Решение
Исключение пустого указателя является результатом распаковки результата inverse.get(animal)
. Если inverse
не содержит ключа animal
, он возвращает null
, & Quot; типа & Quot; Integer
. Учитывая, что присвоение относится к ссылке int
, Java распаковывает значение в inverse.containsKey(animal)
, что приводит к исключению нулевого указателя.
Вы должны либо проверить <=>, либо использовать <=> в качестве типа локальной переменной, чтобы избежать распаковки и действовать соответствующим образом. Правильный механизм зависит от вашего контекста.
Другие советы
Проверьте на наличие inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>
. Обратное может не иметь животных.
У вас должна быть трассировка стека.Там точно сказано, что это была за линия, где это произошло.Опубликуйте это, и мы сможем рассказать.
Из всего опубликованного кода я могу "догадаться", что одно из них является потенциальным NullPointerException (NPE).
node
может быть нулевым и вызывающим node.getParent
.
Родительский узел может иметь значение null и вызывать parent.getChildren
может выдать NPE.
Один из братьев и сестер может быть нулевым и вызывать sibling.equals
может выдать NPE.
cellInfo может быть нулевым и cellInfo.inverse
выброшу его.
Наконец, возвращаемое "обратное" значение может быть нулевым и inverse.get()
выброшу его.
Фух!!...
Итак, чтобы избежать этих диких догадок, почему бы вам просто не опубликовать свой stacktrace, и мы узнаем?
Это должно быть что-то вроде:
java.lang.NullPointerException: null
at YourClass.setSiblings( YouClass.java:22 )
at YourClass.setSiblng( YourClass.java: XX )
и т.д...