NullReference Exception

phap69

Mitglied
Hoffe ich bin im richtigen Unterforum.
Ich verzweifle gerade an im Betreff bezeichneter Fehlermeldung. Als C# und OOP - Neuling bitte ich auch eine dumme Frage zu entschuldigen.

Ein Objekt, welches ich aus einem anderen heraus erstellt habe ist nicht mehr verfügbar, wenn ich eine andere Aktion vornehme.

Vielleicht helfen die untenstehenden Codeschnipsel:

Ich habe eine Klasse Spieler deren Objekte mit der FormularInitialisierung erzeugt werden.
Diese Klasse verfügt über eine Methode WetteAbgeben(), welche durch Klick eines Buttons Objekte der Klasse Wette erzeugt.
Wenn ich danach über Klick eines anderen Buttons wieder auf die Felder der Wette-Objekte zugreifen möchte scheinen diese weg zu sein. Die Spieler-Objekte sind allerdings noch alle da, d.h. auf deren Felder und Methoden kann ich zugreifen? Was stimmt da nicht?

Bin für jeden Hinweis dankbar.

C#:
//Die Klasse Spieler

public class Spieler
    {
        public string Name;
        public Wette MeineWette=null;
        public int Geld;
       
        public bool WetteAbgeben ( int Einsatz, int Hund)
            {
            Wette MeineWette=new Wette() {Betrag=Einsatz,Hund=Hund, Wetter=this};
            if (this.Geld > Einsatz && Hund > 0) 
            {
                LabelAktualisieren(MeineWette.BeschreibungAbrufen(),false);

                return true;
            
            }
            else { return false; }
            
            }



//Hier ein Ausschnitt aus der Klasse Wette

public class Wette
    {
        public int Betrag;
        public int Hund;
        public Spieler Wetter = null;
        public string BeschreibungAbrufen()
        {
            
            return  Wetter.Name + " wettet " + Betrag + "€ auf Hund" + Hund;
                  
      }  
...
}


//Hier tauchen die Probleme auf

 public void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Name des Wetters: " + player[0].Name); // Das geht
            MessageBox.Show("Wette auf Hund" + player[0].MeineWette.Hund); //Hier wird die NullReference Exception gemeldet
        }
 
Zuletzt bearbeitet von einem Moderator:

sheel

I love Asm
Hi

in WetteAbgeben legst du mit "Wette MeineWette=new Wette()"
eine neue Variable MeineWette an, obwohl es außerhalb der {},
auf Klassenebene, schon eine gibt. Die außerhalb willst verwenden,
es wird aber immer die innerste von den {}-Verschachtelungen genommen.

Mach keine neue Variable, dann wird die Äußere verwendet, und alle Probleme sind weg.
Einfach "MeineWette=new Wette()" ohne dem Wette vorne.


Ein paar generelle Tipps:

Deine Zeileneinrückungen sind sehr durcheinander.
Hier gehts ja noch, aber bei längeren Codes kennt sich keiner mehr aus.
Du wahrscheinlich auch nicht.

Variablen in Klassen sollten nur mit gutem Grund public sein.
Sonst private (oder protected) und dazu, wenn benötigt,
Methoden zum Auslesen und Ändern von außen.
Die Methode scheint zurzeit vllt. unnötig umständlich,
lohnt sich aber bei größeren Programmen.
Besser nicht falsch angewöhnen.

Für Programmcode im Forum bitte die Codetags verwenden (die ich gerade reineditiert habe).
Wird dadurch doch gleich besser lesbarer.
(Und es ist nicht! nötig, alles selbst einzufärben. Das geht ganz von selbst.)

Gruß
 

phap69

Mitglied
Vielen Dank.

Hast Du einen Tip für die richtige Anordnung von Zeileneionrückungen. Ich habe im Grunde einfach die Vorgaben von VisualStudio übernommen. Kann auch sein, dass bei reinkopieren einiges durcheinander gekommen ist.

Gibt es so etwas wie einen Standard?

Die Sache mit der Kapselung ist mein nöchster Lernschritt, danke aber schon mal für den Hinweis ;)
 

Shakie

Erfahrenes Mitglied
VisualStudio sollte Code eigentlich automatisch formatieren. Ansonsten über den Menüeintrag Bearbeiten->Erweitert->Dokument formatieren.