Shu*_*uma 1 java tree nullpointerexception
我在使用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)
Run Code Online (Sandbox Code Playgroud)
问题的方法是:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
抛出错误的行:
if (currentNode.identifier == memberIdentifier || cascade == true || currentNode.partner.identifier == memberIdentifier){
Run Code Online (Sandbox Code Playgroud)
现在作为一个猜测,我会说我得到这个错误,因为我正在检查其值的currentNode.partner.identifier为null/currentNode.partner节点不存在.
这并不妨碍前两个相同的检查功能正常,所以我有点困惑为什么这条线有任何不同.
结构是
Alice[2] <--partner-- John[1]
|
Ted[3] --sibling--> Eric[4] --sibling--> Joanne[5]
Run Code Online (Sandbox Code Playgroud)
if (currentNode.identifier == memberIdentifier || currentNode.partner.identifier == memberIdentifier){
Run Code Online (Sandbox Code Playgroud)
查看代码后,我期望该特定行抛出空引用错误的唯一原因是if currentNode.partner
为null.
它之所以每次都不同了,是因为你是不断变化的currentNode
,像这样
currentNode = currentNode.sibling;
Run Code Online (Sandbox Code Playgroud)
另外,如果你的If条件看起来如此,那么无论什么是if (A || B)
真的,它总是为真,所以它不会检查何时为真.A
B
B
A
由于这种行为而且与之相反&&
,您可能会看到类似的情况
if(myObj != null && myObj.value == otherVal)
Run Code Online (Sandbox Code Playgroud)
您之前的行可能永远不会执行
currentNode.partner.identifier == memberIdentifier
如果currentNode.identifier == memberIdentifier
或是cascade
真的
因此,即使currentNode.partner
在非null 时执行完全相同的行,也可能在更改后不是这种情况currentNode
如果我是你,我会找到一个好的java调试器,并在错误发生之前放置一个断点.