BST Kreuzung Nullpointer

stimmen
0

Ich versuche, eine neue BST aus der Kreuzung von zwei bekannten BSTs zu erstellen. Ich bin eine Nullpointer im intersect2 Methode int er zweiten Fall an der Linie „cur3.item.set_account_id (cur1.item.get_accountid () + cur2.item.get_accountid ());“ zu bekommen. Ich weiß, dass Sie die Fehlermeldung erhalten, wenn Sie dereferenzieren die Variable versuchen, ohne es zu initialisieren, aber ich glaube, ich bin es zu initialisieren? Ich bin mir nicht wirklich sicher. Ich würde die Hilfe zu schätzen wissen.

public static Bst<Customer> intersect(Bst<Customer> a, Bst<Customer> b){
     return( intersect2(a.root, b.root));
 }

  public static Bst<Customer> intersect2(BTNode<Customer> cur1, BTNode<Customer> cur2){
  Bst<Customer> result = new Bst<Customer>();

// 1. both empty -> true
  if (cur1==null && cur2==null){
  result=null;
 }
// 2. both non-empty -> compare them
 else if (cur1!=null && cur2!=null) {
  BTNode<Customer> cur3 = new BTNode<Customer>();
  cur3.item.set_account_id(cur1.item.get_accountid()+ cur2.item.get_accountid());
  result.insert(cur3.item);
  intersect2(cur1.left, cur2.left);
  intersect2(cur1.right, cur2.right);
 }

// 3. one empty, one not -> false
else if (cur1==null ||cur2==null){
  BTNode<Customer> cur3 = new BTNode<Customer>();
  cur3.item=null;
  intersect2(cur1.left, cur2.left);
  intersect2(cur1.right, cur2.right);
}
 return result;
}

Hier ist das Bild des Problems: Geben

Veröffentlicht am 20/04/2011 um 20:49
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Es ist, weil die Elementvariable in Customer-Objekt ist nicht initialisiert.

Beantwortet am 20/04/2011 um 20:53
quelle vom benutzer

stimmen
0

Hat Erzeugen der Zuweisung ein BTnode automatisch sein Mitglieds item?

Sie machen:

cur3.item.set_account_id(.. )

Damit dies gelingt, beide cur3und cur3.itemmüssen nicht null sein.

Gleiches gilt für cur1und cur2auch, dass Sie später in dieser Zeile verweisen.

Und das Beispiel des dritten Falles zeigt, dass BTNode.item in einigen Szenarien null sein kann:

cur3.item=null;
Beantwortet am 20/04/2011 um 21:10
quelle vom benutzer

stimmen
1

Eine Nullpointer kann durch eine Reihe von Dingen verursacht werden. In Ihrem gegebenen Beispiel cur1 und CUR2 ist nicht null, aber es gibt keine Garantie, dass cur1.item, cur1.item.accountId (und ähnlich für CUR2) nicht null.

Sein als Sie keine Beschreibung für die zugrunde liegende Implementierung haben, kann ich nicht weiter unterstützen. Ich kann empfehlen , dass Sie etwas von ein paar Dinge tun:
. 1.) überprüfen Sie die Umsetzung Ihrer Objekte (wenn dies jedes Mal passiert, kann es eine Art Initialisierung Problem sein
2.) Jedes Mal , wenn Sie eine Instanz Ihrer Artikel erstellen, tun Sie sicherstellen , dass das accountId Feld angeben? Versuchen Sie einen Standardwert für dieses Feld zu geben , damit es nicht null sein kann. (versuchen , irgendeine Art von unzulässigem Wert [zB -1, falsch, etc] und Test dafür.

Wenn Sie weitere Details der Implementierung veröffentlichen, I (oder jemand) kann in der Lage sein, direkt das Problem zu identifizieren.

Grüße.

Edit: 20.4 @ 17: 11 Hier ist ein Beispiel dafür, was Sie tun sollten.

public class Customer {  
    private int accountId;  

    public Customer() {  
        this.accountId = 0;  
    }  

    public Customer(int account_identification) {  
        this.accountId = account_identification);  
    }  

    //As a side note, general practice implies fields be private  
    //Use a method (hence the term 'getter' and the reciprocal, 'setter')  
    public int getId() {  
        return this.accountId;  
    }  

    public void setId(int replacement_account_identification) {  
        this.accountId = replacement_account_identification;  
    }
}
Beantwortet am 20/04/2011 um 21:11
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more