2009-11-28 15 views
8

此代码导致空指针异常。我不知道为什么:Java:拆箱时的空指针异常整数?

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

我已经在调试器中检查它,所有的局部变量为非空。这还会发生什么? BiMap来自Google Collections。

+5

嗯,他列入了例外被抛出的路线。我不认为NullPointerException stacktrace在这种情况下是有帮助的,除了指向这一行 – notnoop 2009-11-28 13:50:38

回答

35

空指针异常是拆箱inverse.get(animal)的结果。如果inverse不包含密钥animal,则返回null“类型”Integer“。鉴于分配给int引用,Java将该值解包为int,导致空指针异常。

您应该检查inverse.containsKey(animal)或使用Integer作为局部变量类型以避免拆箱并采取相应措施。正确的机制取决于你的情况。

0

你必须有一个堆栈跟踪。它确切地说明发生了什么事情。发布它,我们可以告诉。

从所有发布的代码,我可以“猜”的其中之一是潜在的NullPointerException

节点可以为空,并呼吁node.getParent

节点的父可以为空并调用parent.getChildren可能会抛出数Npe

一个兄弟姐妹可能为空并且调用sibling.equals可能会丢弃Npe

cellInfo可能为空,cellInfo.inverse会抛出它。

最后,返回的“反向”可能为空,并且inverse.get()会抛出它。

呼!! ...

因此,为了避免这样的野生guessings你为什么不只是发表您的堆栈跟踪,我们发现的?

它不应该是这样的:

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

等。

3

检查inverse.containsKey(动物),BiMap反转可能没有动物。