Gå til innhold

Array av objekter - tilgang til elementer


Anbefalte innlegg

Dette er sikkert noe helt elementært som er feil. :blush: 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
Videoannonse
Annonse

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 av kriss
Lenke til kommentar

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

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...