Java Bomberman Probleme java.lang.NullPointerException

DaXtra

Neues Mitglied
Hey,

Ich muss gerade an der Schule ein Java Projekt bewerkstelligen wo ich Bomberman programmiere.

Habe nur gerade ein Problem das ich nicht gelöst bekomme.

Habe einen MainThread der sich um eigentlich alles Kümmert auch mit 60 fps cap, sowie Tripple Buffering beim rendern etc.

Nun so wie es bei Bomberman üblig ist kann man ja Bomben legen und die Explodieren nach einer weile.
Das hab ich mit ner zugehörigen TimerTask gelöst in der jeweiligen Objektklasse.

Problem nun beim spielen, ich hab ne for schleife die mir die Objekte die ich in eine LinkedList mit meiner Methode addObject() hinzufügt sowie mit removeObject() wieder entfernt.
Und manchmal interrupten die sich und ich kriege als index für mein temporäres Objekt null raus, weiß selbst nicht genau warum... = Java.lang.NullPointerException

PS. hab nicht mehr so viel Zeit für das Projekt und sitze da schon seit Ewigkeiten dran. Ich bedanke mich herzlich für jeden Vorschlag und kurzen Kommi.

Public class Handler läuft die Objekte in der LinkedList durch und rendert sie.

public class Handler {
public LinkedList<GameObject> object = new LinkedList<GameObject>();
GameObject tempObject;
Bomb bomb;
Game game;
public int plantedBombs, MaxBombs = 100;
public synchronized void tick() {
for (int i = 0; i < object.size(); i++) {
tempObject = object.get(i);
tempObject.tick(object);
}
}
public void render(Graphics g) {
if (tempObject != null) {
for (int i = 0; i < object.size(); i++) {
tempObject = object.get(i);
tempObject.render(g);
}
}
}
public void addObject(GameObject tempObject) {
this.object.add(tempObject);
}
public void removeObject(GameObject tempObject) {
this.object.remove(tempObject);
}
}

Bombenklasse mit dem Timer der Probleme macht.

public class Bomb extends GameObject {
private Handler handler;
private Bomb thisInstance = this;
public int plantedBombs, MaxBombs = 100;

LinkedList<GameObject> object;

GameObject tempObject;

public Bomb(float x, float y, ObjectId id, Handler handler) {
super(x, y, id);
this.handler = handler;
Timer timer = new Timer();
timer.schedule(task(), 3000);
}
public void tick(LinkedList<GameObject> object) {

}
public void render(Graphics g) {
g.setColor(Color.blue);
g.fillRect((int) x, (int) y, 50, 50);

}
public Rectangle getBounds() {
return new Rectangle((int) x, (int) y, 33, 33);
}
public TimerTask task() {
return new TimerTask() {
public void run() {
System.out.println("remove");
handler.removeObject(thisInstance);
handler.plantedBombs--;
}
};
}



Error:
Exception in thread "Thread-2" java.lang.NullPointerException
at java.util.LinkedList.node(Unknown Source)
at java.util.LinkedList.get(Unknown Source)
at com.davidkowal.bomber.window.Handler.render(Handler.java:37)
at com.davidkowal.bomber.window.Game.render(Game.java:121)
at com.davidkowal.bomber.window.Game.run(Game.java:90)
at java.lang.Thread.run(Unknown Source)
 
Höchstwahrscheinlich ein Threading-Problem, du greifst aktuell mit zwei Threads gleichzeitig ohne synchronisierung auf die Liste zu und entfernst Objekte. Im Handler solltest du alle auf die Liste zugreifenden Elemente entfernen.

Ich würde in Bomb statt direkt zu entfernen ein Flag benutzen, und die dann erst in Handler in tick entfernen - damit ist das Design etwas klarer - syncronisieren solltest du natürlich zusätzlich
 

Zurück
Oben