Avatar billede fastpoint Nybegynder
23. oktober 2004 - 20:34 Der er 19 kommentarer og
1 løsning

Fatal exeption

Hejsa

sidder bare og eksperimentere med Java og er stødt på følgende problem... har 3 klasser... Do.class Terning.class Start.class
Vi kigger på Do.class koden.
Mit spørgsmål er hvorfor kan jeg ikke skrive sådan her?

Terning[] go;

det virker kun hvis jeg skriver Terning[] go = new Terning[];
og selvfølgelig retter til i koden.

Bruger jeg "Terning[] go;" forkert?

public class Do
{
Terning[] go;


  public String velkommen()
  {
    return "Velkommen";
  }
 

  public void Terninger()
  {
 
  go[1] = new Terning();
 
  go[1].kastTerning();

  }
public String toString()
{
  return "Tallet blev " + go[1].getTal() ;
}
}
Avatar billede arne_v Ekspert
23. oktober 2004 - 20:35 #1
Terning[] go;

erklærer en reference til et array af Terning og giver den værdien null.

Hvilket gør at du får en null pointer exception hvis du forsøger at bruge det.
Avatar billede arne_v Ekspert
23. oktober 2004 - 20:37 #2
Terning[] go = new Terning[];

erklærer en reference til et array af Terning, allokerer 2 Terning og sætter
referencen til at pege på det allokerede.

(vigtigt: Terning er selv en reference som er null indtil den sættes til at pege på
noget new'et)
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 20:37 #3
hvordan skal jeg så bruge den? har nemlig ikke helt forstået dens formål endnu... skal man opretter den sådan Terning[] go = new Terning[x];
et sted i koden for så at bruge den?
Avatar billede arne_v Ekspert
23. oktober 2004 - 20:40 #4
Terning[] go = new Terning[2];
for(int i = 0; i < go.length; i++) {
  go[i] = new Terning();
}

så peger både array referencen og de 2 objekt referencer på noget
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 21:35 #5
skulle lige hurtigt spise..

tænkte bare på hvad er formålet med

Terning[] go;

?

for troede man så kunne skrive

go[0] = new Terning();

og dermed peger go[0] på et objekt af typen Terning. Men det kan man ikke hvorfor?
Avatar billede arne_v Ekspert
23. oktober 2004 - 21:38 #6
Du kan sagtens

go[0] = new Terning();

men go[0] skal oprettes først og det gør:

Terning[] go = new Terning[2];
Avatar billede arne_v Ekspert
23. oktober 2004 - 21:38 #7
eller

Terning[] go;
...
go = new Terning[2];
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 21:46 #8
hmm har prøvet begge måde nu men får stadig den der fejl.. fatal exeption
prøvede sådan her


public class Do
{
Terning[] go;


  public String velkommen()
  {
    return "Velkommen";
  }
 

  public void Terninger()
  {
 
  Terning[] go = new Terning[2];
  go[0] = new Terning();
  go[0].kastTerning();

  }
public String toString()
{
  return "Tallet blev " + go[1].getTal() ;
}
}



og sådan




public class Do
{
Terning[] go;


  public String velkommen()
  {
    return "Velkommen";
  }
 

  public void Terninger()
  {
  go = new Terning[2];
  go[1].kastTerning();

  }
public String toString()
{
  return "Tallet blev " + go[1].getTal() ;
}
}
Avatar billede arne_v Ekspert
23. oktober 2004 - 21:48 #9
public class Do
{
Terning[] go;


  public String velkommen()
  {
    return "Velkommen";
  }


  public void Terninger()
  {

  Terning[] go = new Terning[2];
  go[0] = new Terning();
  go[0].kastTerning();
  go[1] = new Terning();
  go[1].kastTerning();

  }
public String toString()
{
  return "Tallet blev " + go[1].getTal() ;
}
}
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 21:48 #10
i det første eksempel stod der

return "Tallet blev " + go[0].getTal() ;


og ikke

return "Tallet blev " + go[1].getTal() ;
Avatar billede arne_v Ekspert
23. oktober 2004 - 21:50 #11
Ah !!!!

public class Do
{
Terning[] go;


  public String velkommen()
  {
    return "Velkommen";
  }


  public void Terninger()
  {

  go = new Terning[2];
  go[0] = new Terning();
  go[0].kastTerning();
  go[1] = new Terning();
  go[1].kastTerning();

  }
public String toString()
{
  return "Tallet blev " + go[1].getTal() ;
}
}
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 21:51 #12
øv din kode virker heller ikke:/

vil lige poste de andre classer så du kan se om det har noget med dem at gøre evt
Avatar billede arne_v Ekspert
23. oktober 2004 - 21:51 #13
Og du skal huske at kalde Terninger inden toString !

Er du sikker på at void Terninger() ikke skulle være Do() ?
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 21:51 #14
den virker! kigger lige på den! hehe
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 21:54 #15
nej nej det virker godt sådan der:o) det var den ændring du lavede så der stod

go = new Terning[2];

som gjorde forskellen!

men hvorfor skrive

Terning[] go;
istedet for
Terning[] go = new Terning();

?

er det fordi hvis man fx skrev
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 21:55 #16
go[1] = new Terning();

inde i en metode så vil den ikke blive opfattet som en lokalvariabel?
Avatar billede arne_v Ekspert
23. oktober 2004 - 21:57 #17
Ændringen der fik det til at virke var netop at new'e den globale
go i stedetfor en lokal go (som skyggede for den globale)
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 21:58 #18
ops

Terning[] go;
istedet for
Terning[] go = new Terning[2];

sådan selvfølgelig
Avatar billede fastpoint Nybegynder
23. oktober 2004 - 22:00 #19
Du velkommen til at ligge et svar fik løst en mindre gode der;)
Avatar billede arne_v Ekspert
23. oktober 2004 - 22:04 #20
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester