Java : Unboxing Integer시 널 포인터 예외?
-
06-07-2019 - |
문제
이 코드는 널 포인터 예외를 유발합니다. 왜 그런지 모르겠습니다.
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
, "유형" Integer
. 과제가 int
참조, Java Unbox는 값을 안에 넣습니다 int
, 널 포인터 예외를 초래합니다.
확인해야합니다 inverse.containsKey(animal)
또는 사용 Integer
Unboxing을 피하고 그에 따라 행동하는 로컬 변수 유형으로. 적절한 메커니즘은 상황에 따라 다릅니다.
다른 팁
확인하십시오 inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>
. 역에는 동물이 없을 수도 있습니다.
스택 트레이스가 있어야합니다. 그것은 그 일이 일어난 선이 무엇인지 정확히 말합니다. 그것을 게시하면 우리는 말할 수 있습니다.
게시 된 모든 코드에서,이 중 하나는 잠재적 인 NullPointerException (NPE)입니다.
node
무효가 될 수 있습니다 node.getParent
.
노드의 부모가 무효화되어 호출 될 수 있습니다 parent.getChildren
NPE를 던질 수 있습니다.
형제 자매 중 하나는 무효가되어 호출 될 수 있습니다 sibling.equals
NPE를 던질 수 있습니다.
CellInfo는 null 일 수 있습니다 cellInfo.inverse
던질 것입니다.
마지막으로 반환 된 "반대"는 무일한 일 수 있고 inverse.get()
던질 것입니다.
휴 !! ...
그렇다면이 거친 추측을 피하기 위해 스택 트레이스를 게시하지 않으면 우리가 알게되는 이유는 무엇입니까?
그것은 다음과 같아야합니다.
java.lang.NullPointerException: null
at YourClass.setSiblings( YouClass.java:22 )
at YourClass.setSiblng( YourClass.java: XX )
등.. .