Java: исключение нулевого указателя при распаковке Integer? - PullRequest
14 голосов
/ 28 ноября 2009

Этот код вызывает исключение нулевого указателя. Я понятия не имею, почему:

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);
        }
    }
}

Я проверил это в отладчике, и все локальные переменные не равны NULL. Как еще это могло случиться? BiMap из коллекции Google.

Ответы [ 3 ]

47 голосов
/ 28 ноября 2009

Исключение нулевого указателя является результатом распаковки результата inverse.get(animal). Если inverse не содержит ключ animal, он возвращает null, "типа" Integer. Учитывая, что присвоение относится к int ссылке, Java распаковывает значение в int, что приводит к исключению нулевого указателя.

Вам следует либо проверить inverse.containsKey(animal), либо использовать Integer в качестве типа локальной переменной, чтобы избежать распаковки и действовать соответствующим образом. Надлежащий механизм зависит от вашего контекста.

4 голосов
/ 28 ноября 2009

Проверьте для inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>. Обратное может не иметь животного.

0 голосов
/ 28 ноября 2009

Вы должны иметь трассировку стека. Это точно говорит, что это была за черта, где это произошло. Отправьте это, и мы можем сказать.

Из всего опубликованного кода я могу «догадаться», что одним из них является потенциальное исключение NullPointerException (NPE).

node может быть нулевым и вызывать node.getParent.

Родитель узла может быть нулевым, и вызов parent.getChildren может вызвать NPE.

Один из братьев и сестер может быть нулевым, и, вызывая sibling.equals, можно бросить NPE.

cellInfo может быть нулевым, и cellInfo.inverse выбросит его.

Наконец, возвращаемое значение «инверсия» может быть нулевым, и inverse.get() выбросит его.

Уф !! ...

Итак, чтобы избежать этих диких предположений, почему бы вам просто не опубликовать свою трассировку стека, и мы узнаем?

Должно быть что-то вроде:

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

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...