我在Java中抛出错误的方法遇到麻烦:
Exception in thread "main" java.lang.NullPointerException
at FamilyTree$FamilyTreeNode.access$9(FamilyTree.java:5)
at FamilyTree.displayFamilyMember(FamilyTree.java:166)
at FamilyTreeTest.main(FamilyTreeTest.java:28)
有问题的方法是:
public void displayFamilyMember(){
boolean cascade = false;
int memberIdentifier;
displayFamily();
memberIdentifier = Input.getInteger("Input member ID");
currentNode = ancestor ;
if (currentNode.identifier == memberIdentifier || currentNode.partner.identifier == memberIdentifier){
cascade = true;
if(currentNode.partner!= null){
System.out.println(currentNode.Name + " ID[" + currentNode.identifier + "] Partner: " + currentNode.partner.Name + " ID[" + currentNode.partner.identifier + "]");
}else{
System.out.println(currentNode.Name + " ID[" + currentNode.identifier + "] has no partner");
}
}
if(currentNode.child != null){
currentNode = currentNode.child;
if (currentNode.identifier == memberIdentifier || cascade == true || currentNode.partner.identifier == memberIdentifier){
if(currentNode.partner!= null){
System.out.println(" " + currentNode.Name + " ID[" + currentNode.identifier + "] Partner: " + currentNode.partner.Name + " ID[" + currentNode.partner.identifier + "]");
}else{
System.out.println(" " + currentNode.Name + " ID[" + currentNode.identifier + "] has no partner");
}
}
}
if (currentNode.sibling!= null){
while(currentNode.sibling != null){
currentNode = currentNode.sibling;
if (currentNode.identifier == memberIdentifier || cascade == true || currentNode.partner.identifier == memberIdentifier){
System.out.println("Check for match performed, checking partner !- null");
if(currentNode.partner!= null){
System.out.println(" " + currentNode.Name + " ID[" + currentNode.identifier + "] Partner: " + currentNode.partner.Name + " ID[" + currentNode.partner.identifier + "]");
}else{
System.out.println(" " + currentNode.Name + " ID[" + currentNode.identifier + "] has no partner");
}
}
}
}
else{
System.out.println("member not found");
}
}
引发错误的行:
if (currentNode.identifier == memberIdentifier || cascade == true || currentNode.partner.identifier == memberIdentifier){
现在作为猜测,我会说我得到这个错误,因为我正在检查其值的currentNode.partner.identifier为null / currentNode.partner节点不存在。
这不会阻止前两项相同的检查正常工作,因此我对这行为何有所不同感到困惑。
结构是
Alice[2] <--partner-- John[1]
|
Ted[3] --sibling--> Eric[4] --sibling--> Joanne[5]
编辑:
感谢您的答复,我知道它现在是如何工作的。
if (currentNode.identifier == memberIdentifier || currentNode.partner.identifier == memberIdentifier){
在第一个Node上,这一行应该引发异常,但这不是因为满足第一个条件,而其他条件没有得到检查。问题是当currentNode.partner = Null时引用currentNode.partner.identifier。
最佳答案
查看您的代码后,我希望该特定行引发空引用错误的唯一原因是currentNode.partner
为空。
每次都不一样的原因是因为您不断更改currentNode
currentNode = currentNode.sibling;
此外,如果您的If条件看起来像
if (A || B)
,那么无论A
是什么,当B
为true时它将始终为true,因此当B
为true时它不会检查A
。由于此行为并且与
&&
相反,您可能会看到类似if(myObj != null && myObj.value == otherVal)
您上一行可能从未执行过
currentNode.partner.identifier == memberIdentifier
如果
currentNode.identifier == memberIdentifier
或cascade
为true因此,即使
currentNode.partner
时执行的完全相同的行不为null,更改currentNode
后也可能不是这种情况如果您是我,我会找到一个好的Java调试器,并在发生错误的位置之前放置一个断点。