BST przecięcia NullPointerException

głosy
0

Próbuję utworzyć nowy BST od skrzyżowania 2 znanych BSTS. Otrzymuję NullPointerException w metodzie intersect2 int on drugim przypadku, na linii cur3.item.set_account_id (cur1.item.get_accountid () + cur2.item.get_accountid ());. Wiem, że pojawia się błąd przy próbie dereference zmiennej bez inicjalizacji, ale myślę, że jestem inicjalizacji? Nie jestem do końca pewny. Byłbym wdzięczny za 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;
}

Oto obraz problemu: wprowadzić

Utwórz 20/04/2011 o 20:49
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

To dlatego, że zmienna pozycja w obiekcie klienta nie jest zainicjowany.

Odpowiedział 20/04/2011 o 20:53
źródło użytkownik

głosy
0

Czy tworząc BTNode automatycznie przydzielić jej członkiem item?

Ty robisz:

cur3.item.set_account_id(.. )

Aby to się udało, zarówno cur3i cur3.itemtrzeba być nie zerowy.

Dotyczy to cur1i cur2tak dobrze, że można odwołać w dalszej części tej linii.

A przykładem 3rd przypadku pokazuje, że BTNode.item może być null w niektórych scenariuszach:

cur3.item=null;
Odpowiedział 20/04/2011 o 21:10
źródło użytkownik

głosy
1

NullPointerException może być spowodowane przez wiele rzeczy. W swojej podanym przykładzie CUR1 i cur2 nie są puste, ale nie ma gwarancji, że cur1.item, cur1.item.accountId (i podobnie dla cur2) nie są nieważne.

Być jak nie masz opis realizacji bazowego, nie mogę pomóc dalej. I sugerują, że może to zrobić niektóre z kilku rzeczy:
. 1.) sprawdzić realizację swoich obiektów (jeśli tak się dzieje za każdym razem, nie może być jakiś błąd inicjalizacji
2.) Jeśli chcesz utworzyć instancję swojej pozycji, wykonaj upewnij się, aby określić pole accountid? Spróbuj podać wartość domyślną dla tej dziedzinie, więc nie może być null. (spróbować rodzaju nielegalnej wartości [przykład 1, fałszywy, itp], a test na nim.

Jeśli chcesz dodawać więcej szczegółów implementacji, mogę (lub ktoś) być w stanie bezpośrednio zidentyfikować problem.

Pozdrowienia.

Edit: 4/20 @ 17: 11 Oto przykład tego, co należy robić.

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;  
    }
}
Odpowiedział 20/04/2011 o 21:11
źródło użytkownik

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