BST kryss, NullPointerException

stemmer
0

Jeg prøver å lage en ny BST fra krysset mellom 2 kjente BSTs. Jeg får en NullPointerException i intersect2 metoden int han andre tilfellet på linjen cur3.item.set_account_id (cur1.item.get_accountid () + cur2.item.get_accountid ());. Jeg vet at du får feilmelding når du forsøker å dereference variabelen uten å initialisere den, men jeg tror jeg er å initialisere den? Jeg er ikke helt sikker. Jeg ville sette pris på hjelp.

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

Her er bildet av problemet: skriv

Publisert på 20/04/2011 klokken 19:49
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Det er fordi elementet variabel i Customer objektet ikke er initialisert.

Svarte 20/04/2011 kl. 19:53
kilden bruker

stemmer
0

Har Opprette en BTNode tildele sitt medlem item?

Du gjør:

cur3.item.set_account_id(.. )

For at dette skal lykkes, både cur3og cur3.itemmå ikke være null.

Samme gjelder for cur1og cur2i tillegg, som du refererer senere i denne linjen.

Og eksempel på den tredje saken viser at BTNode.item kan være null i noen scenarier:

cur3.item=null;
Svarte 20/04/2011 kl. 20:10
kilden bruker

stemmer
1

En NullPointerException kan være forårsaket av en rekke ting. I din gitt eksempel cur1 og cur2 er ikke null, men det er ingen garanti for at cur1.item, cur1.item.accountId (og tilsvarende for cur2) er ikke null.

Å være så du har ingen beskrivelse for den underliggende implementeringen, kan jeg ikke hjelpe videre. Jeg kan foreslå at du gjør noen på et par ting:
. 1.) kontrollere gjennomføringen av objektene (hvis dette skjer hver gang, kan det være noen form for initialisering problem
2.) Når du oppretter en forekomst av varen, gjør du sørge for å angi ACCOUNTID feltet? Prøv å gi en standardverdi for dette feltet slik at det ikke kan være null. (prøve noen form for ulovlig verdi [f.eks -1, false, etc] og test for den.

Hvis du vil legge inn flere gjennomføringen detaljer, kan jeg (eller noen) være i stand til å direkte identifisere problemet.

Hilsen.

Edit: 4/20 @ 17: 11 Her er et eksempel på hva du bør gjøre.

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;  
    }
}
Svarte 20/04/2011 kl. 20:11
kilden bruker

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