javanewbie Skrevet 10. mars 2005 Del Skrevet 10. mars 2005 Dette er sikkert noe helt elementært som er feil. Når jeg prøver å få tilgang til de enkelte elementene i bars arrayen får jeg en runtime feil NullPointerException. Hva gjør jeg feil? //a set of double bars class DblBar{ private int budgVal; private int prodVal; public DblBar(){ budgVal=0; prodVal=0; } public void setVal(int budg, int prod){ budgVal=budg; prodVal=prod; } public int getBudgVal(){ return budgVal; } public int getProdVal(){ return prodVal; } } //a graph with a number of double bars class DblBarGraph{ private int numBars; private DblBar[] bars; //constructor public DblBarGraph(int num){ numBars=num; System.out.println("numBars: "+numBars); //viser 2 som forventet bars=new DblBar[numBars]; System.out.println("bars.length: "+bars.length); //viser 2 som forventet } public void setValues(int id, int val1, int val2){ bars[id].setVal(val1,val2); //NullPointerException!! } public int getValue1(int id){ return bars[id].getBudgVal(); } public int getValue2(int id){ return bars[id].getProdVal(); } } public class Test{ public static void main(String[] args){ DblBarGraph graph=new DblBarGraph(2); //new graph with 2 double bars graph.setValues(0,300,286); //NullPointerException!! graph.setValues(1,310,324); System.out.println("Bar 0, budget: " + graph.getValue1(0)); System.out.println("Bar 0, production: " + graph.getValue2(0)); System.out.println("Bar 1, budget: " + graph.getValue1(1)); System.out.println("Bar 1, production: " + graph.getValue2(1)); } } Lenke til kommentar
Frank2004 Skrevet 10. mars 2005 Del Skrevet 10. mars 2005 bars=new DblBar[numBars]; Dette allokerer en array som kan holde referanser til DblBar-objekter, men alle elementer er null til du gir dem en verdi. Lenke til kommentar
Gazette Skrevet 10. mars 2005 Del Skrevet 10. mars 2005 (endret) public void setValues(int id, int val1, int val2) { bars[id] = new DblBar(); // legg til denne bars[id].setVal(val1,val2); //NullPointerException!! } Sånn, nå skal det funke. bars[id] er null til du gir den en verdi. Endret 10. mars 2005 av kriss Lenke til kommentar
javanewbie Skrevet 10. mars 2005 Forfatter Del Skrevet 10. mars 2005 OK. Jeg er nok for dum til å forstå dette. DblBarGraph har en constructor som oppretter et antall nye elementer i bars. DblBar har en constuctor som initialiserer verdiene i hver av disse til 0 (skjønt dette strengt tatt ikke burde være nødvendig). Jeg har altså (eller det trodde i hvertfall jeg) opprettet to elementer i bars og lagt 0 i verdiene til begge. Deretter prøver jeg å endre verdien fra 0 til noe annet vha. setValues() metoden. At verdien er 0 er vel noe annet enn at pekeren/referansen er null? Men det er mulig jeg roter nå... Lenke til kommentar
javanewbie Skrevet 10. mars 2005 Forfatter Del Skrevet 10. mars 2005 Mmmm.. Jeg forstår det ikke helt ennå, men etter en mod av constuctoren som vist under, så virker det: public DblBarGraph(int num){ numBars=num; System.out.println("numBars: "+numBars); bars=new DblBar[numBars]; System.out.println("bars.length: "+bars.length); if(numBars>0){ for(int i=0;i<numBars;i++){ bars[i]=new DblBar(); } } } Lenke til kommentar
Patton Skrevet 10. mars 2005 Del Skrevet 10. mars 2005 Enkelt forklart. Naar du skriver foelgende: String[] textArray = new String[3]; Saa er dette akkurat det samme som: String[] textArray = new String[3]; textArray[0] = null; textArray[1] = null; textArray[2] = null; Du har definert textArray til aa vaere av lengde 3, men hvert element peker fremdeles paa et null objekt. Dette er for et utrent oeye upraktisk, men er hoeyst noedvendig. Hvorfor? Man kan definere arrays av interface, og disse har som kjent ingen konstruktoer. F.eks. interface MyInterface { } og foelgendes ville ha vaert en katastrofe hvis en hadde brukt standard konstruktor (new MyInterface() ) for hvert array-element. MyInterface interfaceArray = new MyInterface[3]; Lenke til kommentar
javanewbie Skrevet 10. mars 2005 Forfatter Del Skrevet 10. mars 2005 Yepp, det høres fornuftig ut. Takker! Lenke til kommentar
buskmann Skrevet 10. mars 2005 Del Skrevet 10. mars 2005 At verdien er 0 er vel noe annet enn at pekeren/referansen er null? Men det er mulig jeg roter nå... 0 er et tall, eventuelt en char/String. null er en referense til ingenting. null.setValue(2, 4); //gir nullpointerexception Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå