Frage von gut4fr5g4, 50

LibGDX Nullpointer OHNE GRUND!?

http://hastebin.com/tonekuwaba.java

Wieso habe ich, wenn ich das ausführe eine Nullpointer Exception in Zeile 56 der Klasse Player?!

Ich habe doch den Rectangle-Array "elements[]" mit einem setter jedes mal übergeben! (s.render-methode der Klasse Map)

Was soll ich tun? -.-

Antwort
von SirNik, 8

Ich mutmaße jetzt einfach mal, falls es nicht korrekt ist, dann ignoriere die Antwort:

Du erstellst in der Klasse Player eine Instanz von Map.
Und nun versuchst du in Player auf ein Element vom Array elements zuzugreifen.
Ich sehe aber nirgends, dass die Methode createMap() aufgerufen wurde. (Außer in der Main, aber du erstellst in Player eine neue Map instanz)
Da du kein Konstruktor benutzt solltest du die Methode aufrufen, deswegen scheint (zumindest nach meiner Logik, wenn ich da drüber schaue) wirst du kein Rectangle-Objekt innerhalb des Arrays elements finden.

Rufe direkt nach map = new Map(); noch map.createMap() auf, vielleicht gehts dann.

Kommentar von gut4fr5g4 ,

funktioniert leider nicht

das createMap wird in der main aufgerufen 

ich schick dir nochmal den ganzen code, vllt kannst du mir dann helfen :C

Code:

http://hastebin.com/juhatexaso.java

Wäre echt geil, wenn du weiter wüsstest :/

Expertenantwort
von KnusperPudding, Community-Experte für Java, 34

Welches der Elemente für die Nullpointer-Exception verantwortlich ist, erfährst du sofort über den Debugger. - Setze einen Breakpoint auf Zeile 56 und wirf den Debugger an

Nachdem ich nicht weiß, inwieweit die Methode Intersector mit Null-Werten umgeht, sind drei Ursachen möglich:

  1. playershape ist null: wenn die Methode createPlayer zuvor nicht aufgerufen wurde
  2. die Array: elements ist null: wenn die Methode setElements zuvor nicht aufgerufen wurde.
  3. das Element an Position: i ist null.

Bei 1 und 2 ist das zuvor zu betonen. 

Ich habe libGDX bei mir (noch) nicht in Verwendung, daher kann ich das nur theoretisch beurteilen.

Kommentar von gut4fr5g4 ,

Hier die Main, an den von dir genannten Punkten liegt es leider nicht... (trotzdem danke natürlich

http://hastebin.com/ojeyamubim.scala

Vielleicht erkennst du jetzt nen fehler

Kommentar von KnusperPudding ,

Sowas sieht man eigentlich sofort über den Debugger. 

- Und nein, leider ist das auch so nicht sichtbar. Anhand dessen sehe ich nicht, wann welche Methode ausgeführt wird. Also die entscheidenden.

Ich hatte es bereits schon mal erwähnt gehabt: Für dich wäre es der absolut beste und der größte Vorteil, zu lernen wie man den Debugger richtig benutzt. 

Das ist ein mächtiges Werkzeug, was dir hilft sämtliche Fehler in deinem Code zu erkennen, die Probleme machen oder machen könnten.

Kommentar von gut4fr5g4 ,

Ja, aber ich weiß ja, dass es an dem Array liegt, denn wenn ich den in der Konsole ausgebe kommt "null" heraus, also wieso soll ich den dann noch benutzen?

LG

Kommentar von KnusperPudding ,

also wieso soll ich den dann noch benutzen?

Exakt deshalb! - Wenn du einen Breakpoint auf setElements setzt (Zeile 30) und einen auf Zeile 56 und du startest den Debugger, siehst du ja, ob zuerst deine CollisionDetection Methode aufgerufen wird, oder zuerst setElements. 

- Allem Anschein nach eben zuerst CollisionDetection.

Kommentar von gut4fr5g4 ,

Ich check den Debugger nicht, deshalb hab ichs mit System.out.println getestet (also in die beiden methoden ein sysout geschrieben und daran konnte ich sehen, dass der setter zuerst ausgeführt wird :c

S. bild oben

Kommentar von KnusperPudding ,

Ich check den Debugger nicht

Ist aber eins deiner wichtigsten Werkzeuge beim Programmieren. 

Anstatt deine Anwendung zu starten, drückst du auf Debugg. Dein Code wird ausgeführt bis zu der Stelle, an der dein Breakpoint steht. Du kannst in dann in Einzelschritten nach verfolgen, wie sich deine aktuellen Variablen verhalten, und deren Werte.

Kommentar von Springrbua ,

Dann solltest du den schleunigst Lernen. Ohne Debugger wirst du bei jedem noch so kleinen Fehler große Schwierigkeiten haben ihn zu finden. Er ermöglicht es dir den Kode Zeile für Zeile durchzuführen und die Werte der Variablen zu jedem Zeitpunkt auszulesen.

Schau dir einfach Videos dazu an (am besten für deine IDE), die hälfte der Fragen die du hier gestellt hast, hättest du dir durch debuggen viel schneller selbst beantworten können.

LG

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten