Exception in thread "Thread-3" java.lang.NullPointerException

mimix

Aktives Mitglied
Hallo

Ich möchte Pacman programmieren. Mein Fenster besteht aus einem JFrame, JPanel mit dem LayoutManager "GridLayout". Da GridLayout-Manager seine Komponente in einem Gitter ordnet das aus gleich grossen gitterzellen besteht ist jede dieser Gitterzelle bei mir ein Panel. So kann im Spiel auf jeder Zelle entweder ein Punkt, eine Wand, ein Geist oder Pacman stehen. Um Pacman auf das Spielfeld zu zeichnen habe ich ein glass pane verwendet. Nun möchte ich aber, dass Pacman auf die unteren Fenster, also auf die einzelnen Kacheln zugreift, um zu überprüfen ob er auf einem Punkt, auf eine Wand oder auf gar nichts steht.

Ich wollte es so machen:
Java:
class MyGlassPane extends JComponent implements ItemListener, Runnable {
...
public void run() {
      Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
      if (has.getKachelRechts().hasPunkt() == true) {
         while (true) {
            // Verändern der x- Koordinate
            x_pos++;
            // Neuzeichnen des Applets
            repaint();
            try {
               Thread.sleep(25);
            } catch (InterruptedException ex) {
            }
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
         }
      }
   }
...

aber bekomme leider eine Exception in thread "Thread-3" java.lang.NullPointerException zurück

Kann mir jemand helfen? 🙁
 
In der MyGlassPane Klasse


Exception in thread "Thread-3" java.lang.NullPointerException
at tt.test.pacman.spielfeld.SpielfeldKachelModel.getKachelRechts(SpielfeldKachelModel.java:86)
at tt.test.pacman.MyGlassPane.run(MyGlassPane.java:43)
 
Ich hab mal all deinen Klassen in ein einziges Package gepackt und entsprecht die 1. Zeile deiner Klasse so abgeändert und bei mir startet dein Programm ohne Exception. Ich benutze Eclipse.
 
Nein, keine Fehlermeldung, aber soll denn passieren, soll sich der Punkt auch noch bewegen, wenn ja, sag mir in welcher Klasse du die start Methode deiner JComboBox aufrust und sag mir wo ich nen try - catch Block hinpacken soll, bzw. mach du das und gib mir mal den kompletten StackTrace! (mit ex.printStackTrace() und dann kopieren)
 
Poste mal die Methode getKachelRechts von SpielfeldKachelModel mit korrekter Zeilenangabe ([java=80])

z.B.: [noparse][java=25]System.out.println("Ich bin zeile 25");[/code][/noparse]
[java=25]
System.out.println("Ich bin zeile 25");
[/code]
 
Die run() Methode ist in der MyGlassPane Klasse.

Java:
public void run() {
      Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
      if (has.getKachelRechts().isLeer() == true) {        
        while (true) {
            x_pos++;
            repaint();
            try {
               Thread.sleep(25);
            } catch (InterruptedException ex) {
            }
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
         }
      }
   }


Hier wird die Position festgelegt
Java:
SpielfeldKachelModel has = new SpielfeldKachelModel(null, 12, 12); //x=12,y=12

[JAVA=62]
public SpielfeldKachelModel getKachelRechts() {
return parent.getKachelPosition(pos_x + 1, pos_y);
}
[/code]

Also müsste eig. Pacman laufen, da die Kachel leer ist.


Exception:
Exception in thread "Thread-3" java.lang.NullPointerException
at tt.test.pacman.spielfeld.SpielfeldKachelModel.getKachelRechts(SpielfeldKachelModel.java:63)
at tt.test.pacman.MyGlassPane.run(MyGlassPane.java:40)
at java.lang.Thread.run(Unknown Source)
 
Bekomme nun den Fehler auch. Und meine Schlussfolgerung: parent ist auf jeden fall null. Getestet mit ein System.out.println(parent);

Somit ist MyGlassPane.has.getKachelRechts() dann null und kann daher nicht die Methode ausführen. Warum das so ist habe ich bisjetzt aber nicht rausfinden können, ist ja schließlich dein Code und dein Programmiestil. Mein Tipp: Entweder Englisch (bevorzuge ich), oder deutsch, aber nicht mischen.
 
Entweder Englisch (bevorzuge ich), oder deutsch, aber nicht mischen.
Getter & Setter sollten immer mit get/set starten, sonst findest man sie nicht. Versuch das mal auf Deutsch zu schreiben. frageRechterEckpunktAb() ? Das ist Quatsch. Insofern sollte man da auch wenn man sonst auf deutsch codet die englischen Präfixe beibehalten. Aber ich geb dir Recht: Das beste ist wenn man gleich alles auf Englisch hält.
 
Getter & Setter sollten immer mit get/set starten, sonst findest man sie nicht. Versuch das mal auf Deutsch zu schreiben. frageRechterEckpunktAb() ? Das ist Quatsch. Insofern sollte man da auch wenn man sonst auf deutsch codet die englischen Präfixe beibehalten. Aber ich geb dir Recht: Das beste ist wenn man gleich alles auf Englisch hält.

Auf Deutsch habe ich das in der Schule so gelernt:
Code:
rechterEckpunktGeben()
und
Code:
rechterEckpunktSetzen(...)

Aber darum geht`s hier ja nicht, ich finde halt den Fehler nicht, dafür müsste ich mich ins komplette Programm einlesen mit allen Klassen um es vollständig verstanden zu haben und dann suchen zu können, aber ich glaub das ist nicht der Zweck dieses Forums hier. Vielleicht findet ja jemand den Fehler einfach so beim Überfliegen!
 
Auf Deutsch habe ich das in der Schule so gelernt
Was beweist, dass die Lehrer an der Schule keine Ahnung haben. Wie willst du denn mit so einer Namensgebung herausfinden welche Werte des Objekts du abfragen oder ändern kannst? Da musst du ja die komplette API-Doc durchscrollen. Übrigens gibt es gewisse Frameworks die voraussetzen, dass Getter und Setter sich an die übliche Namenskonvention halten (Java Beans), und wenn die Methoden anders heißen kracht es da.
 
Wie willst du denn mit so einer Namensgebung herausfinden welche Werte des Objekts du abfragen oder ändern kannst? Da musst du ja die komplette API-Doc durchscrollen. Übrigens gibt es gewisse Frameworks die voraussetzen, dass Getter und Setter sich an die übliche Namenskonvention halten (Java Beans), und wenn die Methoden anders heißen kracht es da.

Weshalb ich beim Programmieren ((meist) außer dem Kommentar) immer Englisch verwende.

Aber nun zum Thema:
Ich bin der Meinung, der Fehler liegt ganz wo anders, da ja anscheinend in
Code:
SpielfeldModel.getKachelPosition(int x, int y)
entweder spielfeld[x][y] null ist, was bedeuten würde das vermutlich ein Fehler in den for-Schleifen liegt. Oder dummyWand null ist, wobei mir das sehr unwahrscheinlich zu sein scheint, da im Konstruktor von SpielfeldModel es mit
Code:
dummyWand = new SpielfeldKachelModel(null, -1, -1);
ja initialisiert wird und nirgenswo mehr auf null gesetzt werden kann.
 
@TO Ich würd mal den Eclipse Debugger anschmeißen, damit kommt man in solchen Fällen oft schneller zu einer Lösung.
 
Wie du hast noch nicht debuggt? Wenn ich ne NPE bekomme, ist das Debugging mit sinnvoll gesetzten Haltepunkten das erste was ich mache und das effektivste, um den Ursprung der NPE herauszufinden.
 

Zurück
Oben