PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c# - eigene klasse - NullReferenceException


Caesar
23.06.2004, 12:35
hi!
folgendes problem - ist glaub ich keine große sache für einen routinier:
ich habe eine klasse geschrieben, die einen punkt eines spielfelds für "schiffe versenken" definiert:

// cPunkt definiert eine Klasse fuer Punkte des Spielfeldes
public class cPunkt
{
private bool bshot;
public bool bShot
{
set { bshot = value; }
get { return bshot; }
}
private bool bziel;
public bool bZiel
{
set { bziel = value; }
get { return bziel; }
}
public PictureBox bild;
public cPunkt()
{
bShot = false;
bZiel = false;
bild = new PictureBox();
bild.Image = Image.FromFile("ungesetzt.jpg");
bild.Height = 10;
bild.Width = 10;
}
}

danach habe ich zwei als internal deklarierte 2d-arrays geschrieben bestahnd aus objekten dieser cPunkt-Klasse.
beispiel:
internal cPunkt[,] spielfeld; // eine referenz, die instanziierung folgt später
wenn ich nun z.b. in der formload-methode folgendes schreibe, gibt es eine NullReferenceException. Warum ?

spielfeld = new cPunkt[10,10];
MessageBox.Show(spielfeld[1,1].bZiel.ToString());

da das bZiel ein bool ist, lasse ich es mit ToString() umwandeln in einen string. es müßte doch irgendeine ausgabe geben - zumindest eine messagebox statt eines abbruchs.
hat jemand eine idee?
gruß,
*Caesar*


S.Gebien
23.06.2004, 13:40
Kannst Du den eine Referenz auf ein nicht instanziiertes Objekt legen?

Ich dachte immer, erst die Instanziierung und dann die Referenz

Steff
23.06.2004, 13:43
Hallo Caesar

In .Net sind Arrays Objekte d.h. hiermit erstellst du nur das Array:

spielfeld = new cPunkt[10,10];


Du musst also das 2D-Array noch mit cPunkt-Objekten initialisieren:

spielfeld = new cPunkt[10,10];
for(int x = 0; x < 10; x++)
{
for(int y = 0; y < 10; y++)
spielfeld[x,y] = new cPunkt();
}

Gruss,
Steff

Caesar
23.06.2004, 13:45
hi!
eine referenz ist zum beispiel das hier:
private PictureBox bild;
eine instanz wird daraus gebildet wie folgt:
bild = new PictureBox();

in meinem konkreten fall von oben habe ich die referenz auf mein 2d-array (spielfeld) so deklariert, das sie assemblyweit verfügbar ist.

Caesar
23.06.2004, 13:53
hallo steff!
danke, das war der tip, den ich brauchte. :)
jetzt funktioniert es wunderbar.
gruß,
*Caesar*