Java:整数のボックス化解除時のNULLポインター例外?
-
06-07-2019 - |
質問
このコードは、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);
}
}
}
デバッガで調べましたが、すべてのローカル変数は非ヌルです。他にどのようにこれが起こっているのでしょうか? BiMapはGoogleコレクションのものです。
解決
nullポインタ例外は、inverse.get(animal)
の結果をボックス化解除した結果です。 inverse
にキーanimal
が含まれていない場合、null
、<!> quot; of type <!> quot;を返します。 Integer
。割り当てがint
参照に対するものであることを考えると、Javaは値をinverse.containsKey(animal)
に展開し、NULLポインター例外が発生します。
<=>をチェックするか、ローカル変数タイプとして<=>を使用して、ボックス化解除を回避し、それに応じて動作する必要があります。適切なメカニズムはコンテキストに依存します。
他のヒント
inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>
を確認します。逆は動物がいないかもしれません。
スタックトレースが必要です。それはまさにそれが起こった行でした。投稿してください。
投稿されたすべてのコードから、<!> quot; guess <!> quot;これらの1つは、潜在的なNullPointerException(NPE)です。
node
はnullで、node.getParent
を呼び出す場合があります。
ノードの親がnullの可能性があり、parent.getChildren
を呼び出すとNPEがスローされる場合があります。
兄弟の1つがnullであり、sibling.equals
を呼び出すとNPEがスローされる場合があります。
cellInfoはnullの場合があり、cellInfo.inverse
はそれをスローします。
最後に<!> quot; inverse <!> quot; nullが返される場合があり、inverse.get()
がスローします。
Phew !! ...
だから、このワイルドな推測を避けるために、スタックトレースを投稿してみてください。
次のようになります:
java.lang.NullPointerException: null
at YourClass.setSiblings( YouClass.java:22 )
at YourClass.setSiblng( YourClass.java: XX )
etc ..。