2009-11-28 10 views
8

このコードでは、NULLポインタ例外が発生しています。理由はわかりません:Java:Integerのアンボックス時にポインタの例外が無効ですか?

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 Collectionsのものです。

+5

まあ、彼は例外がスローされた行を含んでいました。私はNullPointerExceptionのstacktraceがこの場合に役立つとは思わない、行を指すのに加えて – notnoop

答えて

35

nullポインタ例外は、inverse.get(animal)の結果をアンボックスした結果です。 inverseにキーanimalが含まれていない場合は、タイプIntegernull "を返します。代入がint参照にあるとすれば、Javaはその値をintにunboxし、結果としてNULLポインタ例外が発生します。

inverse.containsKey(animal)をチェックするか、ローカル変数タイプとしてIntegerを使用して、ボックス化を回避し、それに応じて処理する必要があります。適切なメカニズムは、あなたの状況に依存します。

0

スタックトレースが必要です。それは起こった行が何であったか正確に言います。それを掲示すればわかります。私はこれらのいずれかを「推測」することができ、すべての投稿のコードから

は、潜在的なNullPointerExceptionがある

ノードがnullの場合も、ノードの親がnullの場合もあるとparent.getChildrenを起動すると、NPE

をスローすることが node.getParent

を呼び出します

兄弟がヌルである可能性があり、sibling.equalsがNpeを投げる可能性があります。

cellInfoがnullになり、cellInfo.inverseが投げることがあります。

最後に返される "inverse"はnullで、inverse.get()はそれをスローします。

ふう!! ...

だから、あなたは自分のスタックトレースを投稿していない理由は、この野生guessingsを行うことを避けるために、私たちが知りますか?

それが必要のようなもの:

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

など。。

3

inverse.containsKey(動物)を確認すると、BiMap逆数が動物を持っていない可能性があります。

関連する問題