Java:NullPointerException不一致

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)

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

Sam*_*ica 5

查看代码后,我期望该特定行抛出空引用错误的唯一原因是if currentNode.partner为null.

它之所以每次都不同了,是因为你是不断变化的currentNode,像这样

currentNode = currentNode.sibling;  
Run Code Online (Sandbox Code Playgroud)

另外,如果你的If条件看起来如此,那么无论什么是if (A || B)真的,它总是为真,所以它不会检查何时为真.ABBA

由于这种行为而且与之相反&&,您可能会看到类似的情况

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调试器,并在错误发生之前放置一个断点.