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 ノードが存在しないため、このエラーが発生していると言えます。

これは、前の 2 つの同一のチェックが正しく機能することを妨げるものではないので、この行が異なる理由について少し困惑しています。

構造は

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

あなたのコードを見た後、特定の行が null 参照エラーをスローすると予想される唯一の理由は、null の場合currentNode.partnerでした。

毎回違うのは君がcurrentNodeそうやって変わり続けるから

currentNode = currentNode.sibling;  

さらに、 If 条件が次のように見える場合、何が真であるかに関係なくif (A || B)常に真である場合は真であるため、真である場合はチェックされません。ABBA

この動作と の逆であるため、次の&&ような条件が表示される場合があります。

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

前の行が実行されていない可能性があります

currentNode.partner.identifier == memberIdentifier

currentNode.identifier == memberIdentifierまたはcascade本当だった場合


このため、まったく同じ行が実行されたときcurrentNode.partnerに null でなかったとしても、変更後はそうではない可能性があります。currentNode


私があなたなら、良い Java デバッガーを見つけて、エラーが発生する場所の前にブレークポイントを置きます。

于 2013-05-09T18:52:16.557 に答える