我在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 == memberIdentifiercascade为true



因此,即使currentNode.partner时执行的完全相同的行不为null,更改currentNode后也可能不是这种情况



如果您是我,我会找到一个好的Java调试器,并在发生错误的位置之前放置一个断点。

10-07 15:43