BST διασταύρωση, NullPointerException

ψήφοι
0

Είμαι προσπαθεί να δημιουργήσει ένα νέο BST από τη διασταύρωση των 2 γνωστών BSTs. Είμαι πάρει ένα NullPointerException στη μέθοδο intersect2 int αυτός δεύτερη περίπτωση, στη γραμμή cur3.item.set_account_id (cur1.item.get_accountid () + cur2.item.get_accountid ())?. Ξέρω ότι μπορείτε να πάρετε το σφάλμα όταν προσπαθείτε να dereference μεταβλητή χωρίς προετοιμασία αυτό, αλλά νομίζω ότι είμαι αυτό προετοιμασία; Δεν είμαι σίγουρος. Θα εκτιμούσα τη βοήθεια.

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

Εδώ είναι η εικόνα του προβλήματος: εισάγετε

Δημοσιεύθηκε 20/04/2011 στις 20:49
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
0

Αυτό οφείλεται στο γεγονός ότι το στοιχείο μεταβλητή αντικειμένου Πελάτης δεν έχει προετοιμαστεί.

Απαντήθηκε 20/04/2011 στις 20:53
πηγή χρήστη

ψήφοι
0

Μήπως δημιουργώντας ένα BTNode διαθέσει αυτόματα μέλος της item;

Κάνεις:

cur3.item.set_account_id(.. )

Γι 'αυτό να επιτύχει, τόσο cur3και cur3.itemπρέπει να μην είναι μηδενική.

Το ίδιο ισχύει και για cur1και cur2επίσης, ότι η αναφορά αργότερα σε αυτή τη γραμμή.

Και το παράδειγμα του 3ου υπόθεση δείχνει ότι BTNode.item μπορεί να είναι μηδενική σε ορισμένα σενάρια:

cur3.item=null;
Απαντήθηκε 20/04/2011 στις 21:10
πηγή χρήστη

ψήφοι
1

Μια NullPointerException μπορεί να προκληθεί από μια σειρά από πράγματα. Στο δεδομένο παράδειγμα σας, cur1 και cur2 δεν είναι μηδενική, αλλά δεν υπάρχει καμία εγγύηση ότι cur1.item, cur1.item.accountId (και ομοίως για cur2) δεν είναι null.

Όντας δεδομένου ότι δεν έχουν καμία περιγραφή για το υποκείμενο εφαρμογή, δεν μπορώ να βοηθήσει περαιτέρω. Μπορώ να προτείνω να κάνετε κάποια από τα λίγα πράγματα:
. 1.) ελέγχει την εφαρμογή των αντικειμένων σας (αν αυτό συμβαίνει κάθε φορά, μπορεί να υπάρχει κάποιο είδος του προβλήματος προετοιμασίας
2.) Κάθε φορά που δημιουργείτε μια παρουσία του αντικειμένου σας, κάντε μπορείτε να βεβαιωθείτε για να καθορίσετε το πεδίο ACCOUNTID; Δοκιμάστε δίνοντας μια προεπιλεγμένη τιμή για αυτό το πεδίο, ώστε δεν μπορεί να είναι null. (δοκιμάστε κάποιο είδος της παράνομης αξίας [π.χ. -1, ψευδή, κλπ] και δοκιμών για αυτό.

Αν θα δημοσιεύσει περισσότερες λεπτομέρειες υλοποίησης, Ι (ή κάποιος) μπορεί να είναι σε θέση να προσδιορίσει άμεσα το πρόβλημα.

Χαιρετισμοί.

Επεξεργασία: 4.20 @ 17: 11 Εδώ είναι ένα παράδειγμα του τι θα πρέπει να κάνει.

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;  
    }
}
Απαντήθηκε 20/04/2011 στις 21:11
πηγή χρήστη

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