Java: null ponteiro exceção quando unboxing Integer?
-
06-07-2019 - |
Pergunta
Este código está causando uma exceção de ponteiro nulo. Eu não tenho idéia por que:
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);
}
}
}
Eu examinei-lo no depurador, e todas as variáveis ??locais são não-nulo. Como mais poderia estar acontecendo? O bitmap é do Google Collections.
Solução
A exceção de ponteiro nulo é um resultado de unboxing o resultado de inverse.get(animal)
. Se inverse
não contém o animal
chave, ele retorna null
, "do tipo" Integer
. Dado que a atribuição é uma referência int
, Java unboxes o valor em um int
, resultando em uma exceção de ponteiro nulo.
Você deve ou verificar se há inverse.containsKey(animal)
ou utilização Integer
como o tipo de variável local para evitar unboxing e agir em conformidade. O mecanismo adequado depende do seu contexto.
Outras dicas
Verificar inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>
. O inverso pode não ter o animal.
Você deve ter um stacktrace. Ele diz exatamente o que foi a linha onde isso aconteceu. Postá-lo e podemos dizer.
De todo o código postado, eu posso "adivinhar" um destes são um NullPointerException potencial (NPE).
node
pode ser nulo e node.getParent
chamando.
pai do nó pode ser nulo e invocando parent.getChildren
pode lançar uma NPE.
Um dos irmãos podem ser nulo e invocando sibling.equals
pode lançar uma NPE.
cellInfo pode ser nulo e cellInfo.inverse
vai jogá-lo.
Finalmente, o "inverso" retornado pode ser nulo e inverse.get()
vai jogá-lo.
Ufa !! ...
Assim, para evitar fazer isso guessings selvagens, por que você não basta postar seu stacktrace e descobrimos?
Deve algo como:
java.lang.NullPointerException: null
at YourClass.setSiblings( YouClass.java:22 )
at YourClass.setSiblng( YourClass.java: XX )
etc ...