[Greenfoot] java.lang.NullPointerException

  • Themenstarter Themenstarter VintageSucks
  • Beginndatum Beginndatum
V

VintageSucks

Gast
Hallo,

ich arbeite mit Greenfoot und erstelle gerade ein simples Spiel.

Nun wollte ich eine Pausier-Funktion einbauen, und habe in der World Class Levels

Java:
public boolean isRunning;
Java:
public void act()  
    {  
        checkPause();  
    }
und
Java:
public void checkPause()  
    {  
       String keyPressed = Greenfoot.getKey();  
        if(keyPressed.equals("p"))  
        {  
            if(isRunning)  
            isRunning = false;  
            else if(!isRunning)  
            isRunning = true;  
        }  
    }
eingebaut. In der Actor Class Fee dementsprechend
Java:
public void act()  
{  
    if(((Levels) getWorld()).isRunning)  
    {  
        ...  
    }  
}
Das Kompilieren funktioniert einwandfrei, aber wenn ich das ganze dann ausführe erscheint diese Fehlermeldung:
Java:
java.lang.NullPointerException
	at Levels.checkPause(Levels.java:28)
	at Levels.act(Levels.java:22)
	at greenfoot.core.Simulation.actWorld(Simulation.java:504)
	at greenfoot.core.Simulation.runOneLoop(Simulation.java:447)
	at greenfoot.core.Simulation.runContent(Simulation.java:197)
	at greenfoot.core.Simulation.run(Simulation.java:187)

Was habe ich falsch gemacht? Ich habe schon gegoogelt, aber nicht herausgefunden woran es liegen könnte.
 
kleine Frage:
Was steht denn in:
" at Levels.checkPause(Levels.java:28)"?

Eigentlich ist eine Nullpointer-Exception doch relativ aussagekräftig? 🙂
 
Ich nehme mal an:
keyPressed null oder
Greenfoot ist null.
Wenn Greenfoot keine falsch geschrieben Variable ist, wird wohl ersteres der Fall sein. D.h. du musst erst noch auf [c]null[/c] prüfen.
 
Greenfoot (Greenfoot_DE_2_0) -> "Liefert die zuletzt gedrückte Taste zurück (seit dem letzten Aufruf). Wenn seit dem letzten Aufruf der Methode keine Taste gedrückt wurde, wird null zurückgegeben."

->
if (keyPressed != null && keyPressed.equals("p"))
oder
if("p".equals(keyPressed))
 
was für einen Wert hat denn "isRunning" am Anfang? 😀

Kenn mich leider mit Greenfoot nicht aus, und weiß nicht, wo checkPause() aufgerufen wird..
 
Code:
isRunning
ist am Anfang scheinbar auf
Code:
false
(genau weiß ich es aber auch nicht), und
Code:
checkPause()
wird ab dem Levelstart ununterbrochen ausgeführt um auf ein p zu warten.
 
Java:
public void checkPause()  
    {  
       String keyPressed = Greenfoot.getKey();  
        if(keyPressed.equals("p"))  
        {  
            if(isRunning)  
            isRunning = false;  
            else if(!isRunning)  
            isRunning = true;  
        }  
    }

Nur so am Rande: Setz die KLammern sonst hast du irgendwann ohne Ende Fehler die du suchst...

Java:
public void checkPause()  
    {  
       String keyPressed = Greenfoot.getKey();  
        if(keyPressed.equals("p"))  
        {  
            if(isRunning) { 
                isRunning = false;  
            } else {
                isRunning = true;  
            }
        }  
    }
 
Also...
Variante A: Debuggen/Wert ausgeben
Variante B: Variable einfach mal auf true setzen????:L???:L

Und wenn mein Vorredner daran schon was aussetzt:
Du kannst dir das if beim else-Zweig sparen. Ein boolscher Wert ist entweder true oder false. Eine dritte Möglichkeit gibt es nicht (if(true) xxx else yyy ) .... edits sind fies! :lol:
 
Zuletzt bearbeitet:
Noch so ein Trick am Rande: Man kann das ganze verkürzen.
Ausgangssituation:
Java:
if(isRunning)  
      isRunning = false;  
else if(!isRunning)  
      isRunning = true;
Verkürzen:
Kürzer wäre wohl das [c]else if[/c] durch ein else zu ersetzen, aber noch kürzer geht es, wennn du einfach folgendes schreibst:
Java:
isRunning=!isRunning;
 
das verkürzen war ein guter tipp, danke. 🙂

Variante B: Variable einfach mal auf true setzen????:L???:L

wenn ich das mache, startet das ganze zwar endlich unpausiert, lässt sich aber nicht pausieren.

kann man nicht irgendwie unpausiert starten, und erst beim drücken von p pausieren? ein spiel das pausiert startet ist ja irgendwie nicht schön. 😀
 
wo hast du die Variable denn auf "true" gesetzt?

ich meinte statt
Java:
public boolean isRunning;
ein
Java:
public boolean isRunning = true;
Eigentlich sollte das pausieren dann immernoch gehen.


Achja, noch etwas: Statt dem if-else ginge auch ein:
Java:
isRunning = !isRunning;
was den Wert ja "herumdreht"
 
oh, jetzt funktioniert es ja doch. keine ahnung was ich eben gemacht habe.

vielen dank für eure hilfe! 🙂
 

Neue Themen


Zurück
Oben