NullPointerException

Maerc

Mitglied
Ich lerne seit ein paar Tagen Java und komme einfach nicht drauf, warum dieser Code nicht funktionieren will ...

Java:
public class Ratespiel {
    Spieler s1;
    Spieler s2;
    Spieler s3;
   

    public void starteSpiel (){
        s1 = new Spieler();
        s2 = new Spieler();
        s3 = new Spieler();
    }
   
    int tipp1 = 0;
    int tipp2 = 0;
    int tipp3 = 0;
   
    boolean s1hatRecht = false;
    boolean s2hatRecht = false;
    boolean s3hatRecht = false;
   
    int zielZahl = (int) (Math.random()*10); {
       
   
    while(true) {
        System.out.println("Die zu erratene Zahl ist " +zielZahl);
       
        s1.raten();
        s2.raten();
        s3.raten();
       
        tipp1 = s1.zahl;
        System.out.println("Spieler eins tippt " + tipp1);
       
        tipp2 = s2.zahl;
        System.out.println("Spieler zwei tippt " + tipp2);
       
        tipp3 = s3.zahl;
        System.out.println("Spieler drei tippt " + tipp3);
       
        if(tipp1 == zielZahl) {
            s1hatRecht = true;
        }
        if(tipp2 == zielZahl) {
            s2hatRecht = true;
        }
        if(tipp3 == zielZahl) {
            s3hatRecht = true;
        }
        if (s1hatRecht || s2hatRecht || s3hatRecht) {
            System.out.println("Wir haben einen Gewinner!");
            System.out.println("Spieler eins hat richtig geraten? " + s1hatRecht);
            System.out.println("Spieler zwei hat richtig geraten? " + s2hatRecht);
            System.out.println("Spieler drei hat richtig geraten? " + s3hatRecht);
            System.out.println("Das Spiel ist aus.");
            break;
           
        }
        else {
            System.out.println("Wir müssen nochmal spielen!");
        }
    }
} }

Code:
public class Spieler {
    int zahl = 0;
   
    public void raten(){
        zahl = (int) (Math.random() *10);
        System.out.println("Ich tippe auf die Zahl: " +zahl);
    }
}

Java:
public class SpielStarter {
    public static void main (String[] args) {
        Ratespiel spiel = new Ratespiel();
        spiel.starteSpiel();
    }
}

Der Fehler lautet:
Exception in thread "main" java.lang.NullPointerException
at Ratespiel.<init>(Ratespiel.java:28)
at SpielStarter.main(SpielStarter.java:4)

Und der Befehl: Die zu erratene Zahl ist ...
klappt auch, aber danach kommt einfach nichts mehr.
 
Eine NullPointerException besagt dass du auf ein Attribut/Methode einer Variable zugreifen willst, welche nicht initialisiert wurde.
Bei deinem Code wäre dies eigentlich nur bei "s1" usw. möglich. Diese Variablen werden aber in einer Methode erstellt (welche du auch aufrufst).


Leider kann ich nichts genaueres sagen, da dieser Code, so wie du ihn hier gepostet hast, nicht kompilierbar ist.
Der Code in der Klasse Ratespiel steht einfach so da, gehört aber in eine Methode.
 
Ich habe meinen Fehler auch gerade gefunden. Nochmal auf einfach:
Java:
[...]
boolean s1hatRecht = false;
    boolean s2hatRecht = false;
    boolean s3hatRecht = false;
 
    int zielZahl = (int) (Math.random()*10); -------> { <-------
     
 
    while(true) {
        System.out.println("Die zu erratene Zahl ist " +zielZahl);
     
        s1.raten();
        s2.raten();
        s3.raten();
[...]

Die markierte Klammer ist einfach falsch gesetzt. Sobald sie weg ist klappt es problemlos.
Danke für eure Hilfe!
 
Also die Klammer weg zu nehmen dürfte das Problem nicht behoben haben.

Ich denke eher, dass Du die schließende Klammer nach der Initialisierung der s1 - s3 Variablen ebenfalls weggenommen hast, so dass nun eine ganz lange starteSpiel Funktion entstanden ist.

Aber alles ist ok, solange es nun bei Dir funktioniert.
 
Also die Klammer weg zu nehmen dürfte das Problem nicht behoben haben.

Ich denke eher, dass Du die schließende Klammer nach der Initialisierung der s1 - s3 Variablen ebenfalls weggenommen hast, so dass nun eine ganz lange starteSpiel Funktion entstanden ist.

Aber alles ist ok, solange es nun bei Dir funktioniert.
Ja, die angesprochene Klammer ist auch weg 😀.
 
Zwei Kosmetische Probleme habe ich aber noch. Im Moment sieht ein Teil der Ausgabe so aus:
Hat Spieler eins richtig geraten? false
Hat Spieler zwei richtig geraten? false
Hat Spieler drei richtig geraten? true

Gibt es die Möglichkeit das zum Beispiel mit einer Selbstvormulierten Antwort zu versehen?



Und ein früherer Teil der Ausgabe lautet:
Ich tippe auf die Zahl: 7
Ich tippe auf die Zahl: 1
Ich tippe auf die Zahl: 9

Kann ich das mit Arrays und Schleifen Spieler-Spezifisch gestalten? Das heißt in etwas so:
Spieler eins tippt: 7
Spieler zwei tippt: 5
Spieler drei tippt: 1
 
Du kannst die Daten in Arrays packen. Also statt s1, s2 und s3 hast du dann ein Array für die Spieler. Und dann kannst Du die Spielernamen definieren also von mir aus als fixes Array mit { "eins", "zwei", "drei" }.
Und dann kannst Du in einer Schleife die Spieler durchgehen und die Ausgabe gestalten.

Und auch die Ausgabe oben kannst Du dann entsprechend prüfen und die if bedingung würde dann mal das eine oder mal das andere ausgeben, so dass Du halt Sätze hast wie "Spieler eins hat richtig geraten" und "Spieler eins hat falsch geraten".
 

Neue Themen


Zurück
Oben