23

このコードにより、nullポインタ例外が発生しています。理由がわかりません:

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コレクションからのものです。

4

3 に答える 3

68

nullポインター例外は、の結果をボックスから外した結果ですinverse.get(animal)inverseキーが含まれていない場合は、「タイプ」をanimal返します。割り当てが参照に対するものである場合、Javaは値をボックスから取り出し、nullポインター例外を発生させます。nullIntegerintint

ボックス化を回避し、それに応じて動作するように、ローカル変数タイプを確認するinverse.containsKey(animal)か、ローカル変数タイプとして使用する必要があります。Integer適切なメカニズムは、コンテキストによって異なります。

于 2009-11-28T05:46:16.937 に答える
4

を確認してくださいinverse.containsKey(animal), BiMap<PhylogenyTree, Integer>。逆は動物を持っていない可能性があります。

于 2009-11-28T08:31:25.787 に答える
-1

スタックトレースが必要です。それはそれが起こった線が正確に何であったかを言います。投稿すればわかります。

投稿されたすべてのコードから、これらの1つが潜在的なNullPointerException(NPE)であると「推測」できます。

nodenullであり、を呼び出している可能性がありますnode.getParent

ノードの親がnullである可能性があり、呼び出しparent.getChildrenによってNPEがスローされる可能性があります。

兄弟の1つがヌルであり、呼び出すとsibling.equalsNPEがスローされる可能性があります。

cellInfoはnullの可能性があり、cellInfo.inverseそれをスローします。

最後に、返される「逆」はnullである可能性があり、inverse.get()それをスローします。

ふぅ!!..。

だから、この野蛮な推測を避けるために、スタックトレースを投稿してみませんか?

次のようになります。

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

など。。

于 2009-11-28T05:59:22.247 に答える