BST křižovatka, NullPointerException

hlasů
0

Snažím se vytvořit nový BST od křižovatky 2 známých BSTs. Začínám NullPointerException v metodě intersect2 int on druhém případě, v řádku cur3.item.set_account_id (cur1.item.get_accountid () + cur2.item.get_accountid ());. Vím, že se dostanete k chybě při pokusu o dereference proměnné bez jeho inicializaci, ale myslím, že jsem to inicializaci? Nejsem si úplně jistý. Chtěl bych ocenit pomoc.

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

Zde je obraz problému: zadejte

Položena 20/04/2011 v 20:49
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

Je to proto, že proměnná položka v objektu Customer není inicializován.

Odpovězeno 20/04/2011 v 20:53
zdroj uživatelem

hlasů
0

Má Vytvoření BTNode automaticky přidělit svého člena item?

Děláš:

cur3.item.set_account_id(.. )

Aby toto bylo úspěšné, a to cur3i cur3.itemtřeba není null.

Totéž platí pro cur1a cur2také, že odkazovat později v tomto řádku.

A příklad 3. případ ukazuje, že BTNode.item může být null v některých případech:

cur3.item=null;
Odpovězeno 20/04/2011 v 21:10
zdroj uživatelem

hlasů
1

NullPointerException mohou být způsobeny řadou věcí. Ve vašem uvedeném příkladu cur1 a cur2 nejsou null, ale neexistuje žádná záruka, že cur1.item, cur1.item.accountId (a podobně cur2) nejsou null.

Bytí jako nemáte popis podkladového realizaci, nemohu pomoci dále. Mohu navrhnout, že si někteří z několika věcí:
. 1) kontroluje plnění svých objektů (pokud se tak stane Pokaždé, může tam být nějaký problém inicializace
2.) Kdykoli vytvořit instanci položky, dělat byste se ujistit, určit pole accountid? Zkuste dát výchozí hodnotu pro toto pole, takže to nemůže být null. (zkuste nějakou ilegální hodnoty [např -1, false, etc] a test na to.

Máte-li zájem přidat více podrobností realizace, může I (nebo někdo jiný) být schopen přímo identifikovat problém.

Pozdravy.

Edit: 4/20 @ 17: 11 Zde je příklad toho, co byste měli dělat.

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;  
    }
}
Odpovězeno 20/04/2011 v 21:11
zdroj uživatelem

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