Laden...

[gelöst] NullReferenceException bei Array-Zugriff

Erstellt von Dennis82 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.732 Views
D
Dennis82 Themenstarter:in
4 Beiträge seit 2009
vor 15 Jahren
[gelöst] NullReferenceException bei Array-Zugriff

Hallo zusammen,

ich quäle mich derzeit berufsschulbedingt mit C# herum. Um mich ein wenig mit der Materie zu beschäftigen, habe ich mir überlegt, ein kleines Kartenspiel in C# zu schreiben. Nun habe ich jedoch einen Punkt erreicht, an dem ich einfach nicht weiterkomme. Ich möchte das Array


Spieler[i].spielerblatt[j].kartennummer = karten[n].kartennummer;

füllen, bekomme aber immer eine Fehlermeldung des Typs System.NullReferenceException.

Hier nun noch die entsprechende Klasse, in der sich das Array befindet :


class spieler 
    {
        public string name;
        public int guthaben;
        public int einsatz;
        public Karte [] spielerblatt;
                        
        public spieler[] austeilen(int anzahlspieler)
        {
           Karte blatt = new Karte();
           Karte[] karten = blatt.mischen();
           int n = 0;
           spieler[] Spieler = new spieler[anzahlspieler];
           
            
                    
           for (int i = 0; i < 2; i++)                 
               for (int j = 0; j < anzahlspieler  ; j++)
               {
                   Spieler[i] = new spieler();
                   Spieler[i].spielerblatt[j].kartennummer = karten[n].kartennummer;
                   n++;   
               }
           return Spieler;
        }
    }

Kann mir jemand von Euch sagen wo genau der Fehler liegt ?

Gruß & Danke vorab

Dennis

B
196 Beiträge seit 2007
vor 15 Jahren
Spieler[i].spielerblatt[j]

Das Array spielerblatt ist nicht initialisiert und somit null.

Entweder in einem Konstruktor oder in deiner Funktion (oder an einer anderen passenden Stelle) musst du das erst zuweisen bevor du auf elemente des Arrays zugreifen kannst.

your fragile folded wings
are just tired from the pure blue sky
you dont have to force your smiles for anyone
its okay to smile...for yourself

467 Beiträge seit 2007
vor 15 Jahren

zu deinem code: Ich verstehe nicht, wieso die Mehode austeilen ein Spieler[] zurückgeben soll? Die Methode müsste statisch sein, wenn ich nicht irre.
edit: oder willst du wirklich, dass ein Spieler die anderen zurückgibt?

D
Dennis82 Themenstarter:in
4 Beiträge seit 2009
vor 15 Jahren

Hallo Ihr beiden,

danke für Eure schnellen Antworten. Ich habe schon versucht, das Array spielerblatt mit


spielerblatt[j] = new Karte();

zu initialisieren, leider bekomme ich trotzdem die gleiche Fehlermeldung.

Ich möchte das Spielerarray später zur Auswertung der Karten eines jeden Spielers in einer seperaten Klasse benutzen, daher habe ich mich für eine Methode mit Rückgabewert entschieden.

Ich muss allerdings dazu sagen, dass ich wirklich absoluter Anfänger in C# bin und dies nur notgedrungen lerne, im Rahmen meiner Ausbildung programmiere ich ausschließlich in Navision.

Gruß
Dennis

2.760 Beiträge seit 2006
vor 15 Jahren

Du wirst wohl erstmal eine Instanz des Arrays erzeugen müssen:


Spielerblatt[] spielerbalttArray = new Spielerblatt[100];
//oder:
Spielerblatt[] spielerblattArray = new Spielerblatt[]{new Spielerblatt(), new Spielerblatt(), ...};

Vorher schon mal PHP programmiert? 😉
In C# muss dein Array immer vom gleichen Typ sein wie deine Elemente die du reinpacken möchtest (außer du benutzt ein object[]). Für deinen konkreten Fall heisst das dass du wenn du ein Array mit Karten haben möchtest auch ein Array für Karten erstellen musst:


Karte[] karten = new Karte[5];
karten[0] = new Karte();
karten[1] = new Karte();
.
.
.

Schaut so aus als ob du noch nicht ganz so fit mit den Grundlagen bist, deshalb sei dir das Lesen eines Buches angeraten: 🛈 📗

Sowie evtl. dem Artikel: [Übersicht] .NET Framework 2.X Auflistungen mal einen Blick zu widmen. Meistens lässt sich das mit einer List<T> einfacher bewerkstelligen.

[EDIT] Zum 2. Punkt: Habe überlesen das dein Array bereits den richtigen Typ hat...

K
147 Beiträge seit 2008
vor 15 Jahren

hi,

ich wollt nur mal so fragen, ob du einfach drauf los programmiert hast, oder dich vorher mal hingesetzt hast und genau überlekt hast, wieviele klassen du brauchst und vor allem welche.
Hast vielleicht ein Diagramm gemacht oder so was?

also bei solchen aufgaben und vor allem am anfang ists sehr wichtig nicht einfach "drauf los" zu programmieren, sondern sich erst einmal gedanken zu machen, was denn sinn macht und was gebraucht wird.

also, so wie ich das sehe (außer ich bin gerade ein bisschen verwirrt) solltest du das ganze nochmal überdenken, so wie du das momentan programmiert hast.

ich verstehe z.B. nicht wirklich, was die methode "austeilen" logisch gesehen bei spieler sucht.
Sicherlich ist es bei einem RL kartenspiel so, dass ein spieler die karten austeilt, aber ich denke hier macht das keinen sinn.

also, ich würde z.B. damit anfangen, die methode "austeilen" erst mal aus Spieler zu verbannen. dann würde ich im konstruktor von Spieler ein Array(wenn du die anzahl an karten pro spieler vorher weißt, bzw. diese bei deinem spiel so oder so fest ist) oder eine generic List<T> von "spielerblatt" initialisieren.
die methode "austeilen" sollte von außerhalb dann auf die einzelnen vorher erstellten Objekte von "Spieler" zugreifen (z.b. wenn du auf der GUI(sofern du eine GUI verwendest) auf einen Button "austeilen" klickst. so kannst du dann auch auf die karten der spieler zugreifen.

mfg
Kaeptn

Wer glaubt, Unternehmensberater könnten Unternehmen beraten,
der glaubt auch, Zitronenfalter könnten Zitronen falten.

J
1.114 Beiträge seit 2007
vor 15 Jahren

Ich hab den Thread jetzt nicht bis ins letzte Detail gelesen, aber imho fehlt dir sicherlich eine CardGame Klasse. Die Klasse hätte sicherlich solch nützlich Methoden wie

Player player = game.AddPlayer();
player.Name = "Bubu";

usw.

Das game-Objekte hält somit die Spieler in sich geborgen.
Dem game-Objekt würde ich, nachdem die Spieler definiert sind, auch die Spielmethoden verpassen, d.h. Methode wie ShuffleCards(), DistributeCards() wären meiner Meinung nach auch recht gut darin aufgehoben.

Ich nutze aus Gewohnheit immer gern englische Bezeichnungen für meine Klassen und Objekte

D
Dennis82 Themenstarter:in
4 Beiträge seit 2009
vor 15 Jahren

Hallo zusammen,

danke für Eure Anregungen.

@jaensen

Wir können das Kind ruhig beim Namen nennen, "nicht ganz so fit bei den Grundlagen" ist maßlos untertrieben,
ich bin wirklich absoluter Anfänger 😃 Habe vor meiner Ausbildung zum Fachinformatiker AW praktisch
keinerlei Programmiererfahrung sammeln können und jetzt programmiere ich ausschließlich in Navision,
also nicht objektorientiert.

@Kaeptn-G.

Im Großen und Ganzen hast Du mit Deiner Vermutung recht. Ursprünglich ging mir es darum,
den Umgang mit Konstruktoren, Klassen und Methoden zu erlernen. Dann haben wir in der Berufsschulschule
das Kartenspiel "Wizzard" in C# programmiert und so bin darauf gekommen, mir als Übung selbst ein
Kartenspielprogramm zu schreiben ( in diesem Fall Poker ). Also habe ich begonnen, einige
Methoden, die für das Programm benötigt werden, zu schreiben und habe diese dann auf zwei Klassen aufgeteilt.
So ist beispielsweise die Methode "mischen" der Klasse Karte zugeordnet, ebenso wie die Methoden BlattErstellen.

@Jelly

Ja, so eine Klasse fehlt wirklich noch, da könnte auch eine Methoden zur Gewinnerauswertung
oder auch eine Methoden zum Setzen untergebracht werden.

Gruß
Dennis

D
Dennis82 Themenstarter:in
4 Beiträge seit 2009
vor 15 Jahren

Hallo zusammen,

habe jetzt eine Lösung dazu gefunden :


class spieler 
    {
        public string name;
        public int guthaben;
        public int einsatz;
        public Karte [] spielerblatt = new Karte[52];
                        
        public spieler[] austeilen(int anzahlspieler)
        {
           Karte blatt = new Karte();
           Karte[] karten = blatt.mischen();
           int n = 0;
           spieler[] Spieler = new spieler[anzahlspieler];
                 
            
                    
           for (int i = 0; i < 2; i++)                 
               for (int j = 0; j < anzahlspieler  ; j++)
               {
                   Spieler[i] = new spieler();
                   Spieler[i].spielerblatt[j] = new Karte();
                   Spieler[i].spielerblatt[j].kartennummer = karten[n].kartennummer;
                   n++;   
               }
           return Spieler;
        }
    }

Gruß
Dennis