Gå til innhold

java.lang.NullPointerException - array av objekter


Anbefalte innlegg

Hei! Har et program som bruker et to-dimensjonalt array av klassen "oljefelt" som er deklarert slik:

class Oljefelt {
protected boolean	solgt  = false;
protected String	eier  = "";
protected int  utvunnet	= 0;

static int  	ledigefelt  = 0;

public boolean selg (String oljeselskap) {
 //Sjek
 System.out.println ("inne i selg");
 ledigefelt--;
 return false;
}

public boolean annuler_salg (String oljeselskap) {
 return false;
}

public boolean oppdater_utvinning (int fat) {
 
 return false;
}
}

Inne i "hovedklassen" min (Oblig2) deklarer jeg klassen slik:

class Oblig2 {

static In    tast  = new In ();
static Out    skjerm	= new Out ();
static final  int	rader	= 17;
static final  int	kolonner= 13;
static Oljefelt[][]	felt  = new Oljefelt [rader] [kolonner];

public static void main (String [] args) {
 Oljefelt.ledigefelt = 17*13;

...OSV...	

Men når jeg skal bruke klassen (inne i main-metoden), krasjer programmet:

skjerm.outln ("Hvilket felt ønsker du?");
skjerm.out ("Tast inn hvilken rad du ønsker (x-akse): ");
int radnr = tast.inInt();
skjerm.out ("Tast inn hvilken kolonne du ønsker (y-akse): ");
int kolnr = tast.inInt();
System.out.println (radnr + " " + kolnr);

felt[1][1].selg("hei");
System.out.println ("forbi felt");

Som man ser, kommer man til linja "felt[1][1].selg("hei");". Der blir det krasj.

 

Output:

*** VELKOMMEN TIL RURITANIAS OLJEFELTOVERSIKT ***

Du har følgende valgmuligheter:
 1: Kjøp et felt
 2: Annuler kjøp av et felt
 3: Lag oversiktskart
 4: Lag liste over oljeselskaper
 5: Oppdater oljeutvinning
 6: Finn maksimal og minimal oljeutvinning
 7: Finn sum oljeutvinning
 8: Avslutt
1
Hvilket felt ønsker du?
Tast inn hvilken rad du ønsker (x-akse): 3
Tast inn hvilken kolonne du ønsker (y-akse): 2
3 2
Exception in thread "main" java.lang.NullPointerException
  at Oblig2.main(java.lang.String[]) (Unknown Source)
  at gnu.java.lang.MainThread.call_main() (/usr/lib/libgcj.so.6.0.0)
  at gnu.java.lang.MainThread.run() (/usr/lib/libgcj.so.6.0.0)

 

Men hvorfor? NullPointerException betyr jo at jeg prøver å bruke en peker som peker på null - men har jeg ikke initialisert den men linja "static Oljefelt[][] felt = new Oljefelt [rader] [kolonner];" ?

 

Skjønner ingenting...

Lenke til kommentar
Videoannonse
Annonse

Du har opprettet selve listen, men felt[1][1] er NULL. Alle plassene i en objectliste er i utgangspunktet NULL referanser.

 

feks:

Object list[] = new Object[3];

 

Dette gir følgende innhold i list:

0 --> NULL

1 --> NULL

2 --> NULL

 

Du kan så bruke "list[1] = new String("bare et eksempel");

 

Innholdet i list blir nå:

0 --> NULL

1 --> Object (String, "bare et eksempel")

2 --> NULL

 

Du kan nå feks si "list[1].clone()", og det vil gå helt fint, mens "list[0].clone()" vil gi NullPointerException.

 

Så det du må gjøre er å legge oljefelt inn i listen din.

Endret av mar
Lenke til kommentar

Ok. Hvordan kan jeg da få initalisert alle oljefeltene inn i listen min?

 

Har jo

static Oljefelt[][] felt = new Oljefelt [rader] [kolonner];

så har jo opprettet både Oljefelt-pekere og lagt nye oljefelt inn i pekerne så vidt jeg kan se... Hvis jeg oppretter en (tom) konstruktør, vil den gjøre noen nytte for seg?

 

Er temmelig ny på Java og objektorientert programmering så takker for all hjelp!

Lenke til kommentar

Ruritania begynt med olje... Verden går sannelig fremover.

 

 

Putt noe alla:

for(int i = 0; i<felt.length; i++) 
{
 for(int j = 0; j<felt[i].length; j++) 
 {
   felt[i][j] = new Oljefelt();
 }
}

Tidlig i static void main avdelinga. En tom constructor i Oljefelt gjør sikkert ikke noe (kan fylles etter hvert...)

 

CPL

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...