BST intersecție, NullPointerException

voturi
0

Am încercat să creeze un nou BST de la intersecția 2 BSTs cunoscute. Sunt obtinerea unui NullPointerException în int metoda intersect2 el al doilea caz, la linia cur3.item.set_account_id (cur1.item.get_accountid () + cur2.item.get_accountid ());. Știu că ai o eroare atunci când încercați să dereference variabila fără a initializarea, dar cred că i sînt inițializează? Nu sunt prea sigur. Aș aprecia ajutorul.

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;
}

Aici este imaginea problemei: introduceți

Întrebat 20/04/2011 la 20:49
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

Aceasta se datorează faptului că variabila element în obiect Clientul nu este inițializat.

Publicat 20/04/2011 la 20:53
sursa de către utilizator

voturi
0

Are crearea unui BTNode aloca în mod automat membru al său item?

Tu faci:

cur3.item.set_account_id(.. )

Pentru ca aceasta să reușească, atât cur3și cur3.itemtrebuie să nu fie nul.

Același lucru se aplică cur1și la cur2fel de bine, că faceți referire mai târziu în acea linie.

Iar exemplul treilea caz arată că BTNode.item poate fi nul în unele scenarii:

cur3.item=null;
Publicat 20/04/2011 la 21:10
sursa de către utilizator

voturi
1

Un NullPointerException poate fi cauzata de o serie de lucruri. În exemplul dat, cur1 și cur2 nu sunt nule, dar nu există nici o garanție că cur1.item, cur1.item.accountId (și în mod similar pentru cur2) nu sunt nule.

Fiind ca nu ai nici o descriere pentru punerea în aplicare care stau la baza, nu mă pot ajuta în continuare. Pot sugera să faceți unele dintre câteva lucruri:
. 1.) verifica punerea în aplicare a obiectelor ( în cazul în care acest lucru se întâmplă de fiecare dată, poate exista un fel de problemă de initializare
2.) De fiecare dată când creați o instanță a articolului dvs., nu vă asigurați - vă că pentru a specifica domeniul ACCOUNTID? Încercați oferind o valoare prestabilită pentru acest câmp , astfel că nu poate fi nul. (încercați un fel de valoare ilegale [ de exemplu , -1, fals, etc] și testare pentru ea.

Dacă v-ar posta mai multe detalii de implementare, I (sau cineva) poate fi în măsură să identifice în mod direct problema.

Salutari.

Editare: 4/20 @ 17: 11 Iată un exemplu de ceea ce ar trebui să faci.

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;  
    }
}
Publicat 20/04/2011 la 21:11
sursa de către utilizator

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