2016-04-19 7 views
0

Ich entwickle gerade ein Spiel mit LWJGL 3.0.0b und ein seltsames Ereignis ist aufgetaucht.ArrayList size() Methode Absturz Programm

Hintergrund:.

ich eine benutzerdefinierte Entity-Klasse und ein Unternehmen Manager in meine Entitäten zu speichern, wenn ein Unternehmen aktualisiert wird ein Verfahren „tickTrail“ genannt genannt wird, die in einer Spur Entität fügt das zu machen Grafik visuell besser und unterhaltsam.

Schon habe ich es bis auf die entities.size() Funktion vereinfacht, ja ich versuche, dies selbst zu lösen: P

Eine Lösung, die ich zur Zeit haben wird alle Methoden ähnlich wie diese zu ersetzen:

for (int i = 0; i < entities.size(); i++) 
{ 
    //calls a method for drawing, updating, or input 
} 

zu ersetzen jede einzelne entities.size() bis size. size ist eine Variable, die geändert wurde, wenn eine Entität hinzugefügt, entfernt, die Liste gelöscht oder nur Feinde entfernt wurden.

Diese Methode funktioniert 100%, Fenster ziehen stürzt nicht das Programm mit dieser Methode.

Frage

So zusammenzufassen, wird die abschließende Frage, warum tritt das? Ich habe nicht bestimmt, warum das Ziehen eines Fensters und die Verwendung der size() -Methode der ArrayList das Programm abstürzt, aber das Speichern einer Variablen an ihrer Stelle ist völlig in Ordnung.

Hilfe oder Erklärung für dieses seltsame Phänomen ist sehr geschätzt :)

EDIT Das letzte Mal bearbeitet erwies sich als falsch, auch mit der Größe variabel in das Programm immer noch Verwendung abstürzt, Zeit zum Zeichenbrett zurück zu gehen ....

EDIT ZWEI okay, so dass manchmal die Fenster Werke andermal ziehen es nicht, könnte dies mehr als nur eine einfache Methode size() Aufruf:/

+0

Mit dem Absturz meine ich, dass das Programm nur abstürzt, nicht Ausnahmen nichts. Ich benutze die Eclipse IDE, vielleicht ist es nur das. –

+0

Ich bin nicht sicher, wie wir angesichts der bisher präsentierten Informationen helfen können. Sie haben keine leeren Fangblöcke, oder? Haben Sie es durch den Eclipse Debugger laufen lassen?Ich wette, dass Ihre beste Wette im Moment ist, Teile und Siege zu teilen, einzelne in sich abgeschlossene Teile Ihres Codes zu testen und einen Drilldown durchzuführen, bis Sie die Ursache des Fehlers isoliert haben. –

+1

Mein Geld ist auf eine NullPointerException ... –

Antwort

2

Basierend auf dem, was Sie zur Verfügung gestellt haben, vermute ich, dass mehrere Threads gleichzeitig auf die ArrayList zugreifen und die Threads auf allen anderen stampfen.

Wenn Sie keine Liste über Collections.synchronizedList() erstellen, um sicherzustellen, dass alle Operationen in der Liste atomar sind, sodass die Interna des Arrays nicht beschädigt sind.

Der Grund, warum ich diesen Pfad eingab, ist, dass beim Ziehen von Windows wahrscheinlich mehrere Ereignisse generiert werden, um das Array zu aktualisieren, und Sie versuchen, es gleichzeitig zu durchlaufen.

Wenn Sie eine Variable verwenden, um die Größe zu überwachen, gehen die Concurrency-Probleme verloren. Natürlich haben Sie wahrscheinlich nicht die richtigen Werte in der Variablen, es sei denn, Sie verwenden AtomicInteger oder was auch immer, aber zumindest die Ausnahmen werden nicht geworfen.

+0

Eine gute Schätzung, schätze ich. :) –

+0

Die Methode 'size()' würde selbst bei gleichzeitiger Beschädigung nicht abstürzen. Ein nachfolgender Zugriff durch ungültigen Index könnte (die Ausnahmemeldung würde uns mehr erzählen). – Thilo