1

我在使用 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){

在第一个节点上,这一行应该抛出异常,但不会因为满足第一个条件而其他条件不被检查。在 currentNode.partner = Null 时引用 currentNode.partner.identifier 是问题所在。

4

1 回答 1

5

查看您的代码后,我希望该特定行引发空引用错误的唯一原因是如果currentNode.partner为空。

之所以每次都不currentNode一样,是因为你一直在变化

currentNode = currentNode.sibling;  

此外,如果您的 If 条件看起来像,那么无论if (A || B)何时为真,它都将始终为真,因此它不会检查何时为真。ABBA

由于这种行为并且它与 成反比&&,您可能会看到看起来像

if(myObj != null && myObj.value == otherVal)

您的上一行可能永远不会执行

currentNode.partner.identifier == memberIdentifier

如果currentNode.identifier == memberIdentifiercascade为真


因此,即使在currentNode.partner不为空时执行的完全相同的行,在您更改后也可能不是这样currentNode


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

于 2013-05-09T18:52:16.557 回答