Fehler ConcurrentModificationException

System.exit(0)

Aktives Mitglied
Hallo,

ich bekomme in einem Spiel, das ich gerade zum Üben programmiere, immer mal wieder folgende Fehlermeldung:

Java:
Exception in thread "Thread-4" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at DefendersOfEarth.Collision_Detection.detectHit(Collision_Detection.java:24)
        at DefendersOfEarth.SpielSteuerung.Logic_on_Collisions(SpielSteuerung.java:105)
        at DefendersOfEarth.SpielSteuerung.moveandLogic(SpielSteuerung.java:144)
        at DefendersOfEarth.SpielSteuerung.runGame(SpielSteuerung.java:99)
        at DefendersOfEarth.myMain.run(myMain.java:130)
        at java.lang.Thread.run(Thread.java:619)
BUILD SUCCESSFUL (total time: 51 seconds)

Gemäß API wird hier eine Liste doppelt modifiziert.
Wenn ich aber den Code durchgehe, stelle ich fest, dass in der auslösenden Methode meinse Codes - also Collision_Detection.detectHit(Collision_Detection.java:24) nur eine einzige Liste aufgerüfen wird.
Des Weiteren wird auch in den anderen Methoden, die letztendlich zum Aufruf der Methode führen, keine der betroffenen Listen bearbetiet.
Da sich der Aufruf in der Methode run() des einzigen Threads befindet, ist mir absolut schleierhaft, wieso hier dieser Fehler auftritt.

Wenn mir jemand helfen könnte, wäre das wunderbar.

Gruß

System.exit(0)

Anbei habe ich die betreffenden Methoden von unten nach oben, angehängt:

at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)

[JAVA=370] final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
[/code]
at java.util.AbstractList$Itr.next(AbstractList.java:343)
[JAVA=342]
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
[/code]

at DefendersOfEarth.Collision_Detection.detectHit(Collision_Detection.java:24)
[JAVA=17]
public static void detectHit(ArrayList <MySprite> List, ArrayList <MySprite> tobehit)
{
for (MySprite TBH : tobehit)
{
Rectangle Rect1 = new Rectangle(TBH.getX(), TBH.getY(), 40,40);
Rectangle Rect2 = new Rectangle();

for(MySprite S : List)
{
Rect2 = new Rectangle(S.getX(), S.getY(), 2, 5);
if (Rect1.intersects(Rect2))
{ TBH.setLebensPunkte(S.getLebensPunkte());
S.setLebensPunkte(S.getLebensPunkte());
}
}
}
}
[/code]
at DefendersOfEarth.SpielSteuerung.Logic_on_Collisions(SpielSteuerung.java:105)
[JAVA=102] private void Logic_on_Collisions()
{
if (justStars) return;
Collision_Detection.detectHit(myBullits, myAliens);
myBullits = Collision_Detection.deleteUsedSprite(myBullits);
myExplosions = Collision_Detection.deleteUsedSprite(myExplosions);
Collision_Detection.explodeAliens(this, myAliens, myShip);
myAliens = Collision_Detection.deleteUsedSprite(myAliens);
}
[/code]
at DefendersOfEarth.SpielSteuerung.moveandLogic(SpielSteuerung.java:144)
[JAVA=118] private void moveandLogic()
{
myShip.move(60);
myShip.doLogic(60);

for (MySprite S : myStars)
S.move(60);
for (MySprite S : myStars)
S.doLogic(60);

if (justStars) return;

for (MySprite S : myBullits)
S.move(60);
for (MySprite S : myBullits)
S.doLogic(60);

for (MySprite S : myAlienBullits)
S.move(60);
for (MySprite S : myAlienBullits)
S.doLogic(60);

for (MySprite S : myAliens)
S.move(60);
for (MySprite S : myAliens)
S.doLogic(60);
if (runme) Logic_on_Collisions();

for (MySprite S : myExplosions)
S.move(60);
for (MySprite S : myExplosions)
S.doLogic(60);

}
[/code]
at DefendersOfEarth.SpielSteuerung.runGame(SpielSteuerung.java:99)
[JAVA=82]
public void runGame()
{
if (myShip.istexplodier())
{
if((System.currentTimeMillis() - explosionTime) > 2000)
{
myShip.istexplodier(false);
runme = true;
}
}
if ((Aliens.getAnzahl() <=0) && (Level > 0))
{
if (Level == maxLevel) Level = 0;
Level +=1;
Parent.loadLevel(Level);

}
moveandLogic();
}[/code]
at DefendersOfEarth.myMain.run(myMain.java:130)
[JAVA=125] public void run()
{
while (GameIsRunning)
{
getDelta();
myGame.runGame();

// doubleBufferStrategy
do
{
do
{
final Graphics G = BF.getDrawGraphics();
FontMetrics FM = getFontMetrics(G.getFont());
try
{
myGame.drawBuffer(G, FM);
}
catch(ConcurrentModificationException Ex)
{
System.out.println(Ex);
}
G.dispose();
} while (BF.contentsRestored());
BF.show();
} while (BF.contentsLost());

delta = current - last;

try {
Thread.sleep(25);
} catch (InterruptedException ex) {
Logger.getLogger(myMain.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
[/code]
at java.lang.Thread.run(Thread.java:619)
[JAVA=617]
public void run() {
if (target != null) {
target.run();
}
}[/code]
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ich glaube kaum, dass aus deinem Code jemand schlau werden kann,
der StackTrace für sich bringt nicht alle Infos,
interessant ist, ob in den inneren Aufrufen was an den Listen verändert wird,

-------

hier eine Methode, ohne irgendwie nachdenken zu müssen:

verwende keine Standardlisten, sondern überschreibe ArrayList, LinkedList oder was auch immer,
gib jeder Liste im Konstruktor ne eindeutige Id,
bei allen add/ remove-Methoden schreibe Debug-Informationen rein
'in Liste xy wird folgendes Objekt eingefügt ..'

im Programm schreibe bei den fraglichen Durchläufen
'starte for-Schleife über Liste xy'


dann bekommst du irgendwann ne Ausgabe
..
..
..
starte for-Schleife über Liste 455
...
..
in Liste 455 wird folgendes Objekt eingefügt ..
..
Exception

eine solche Ausgabe muss man natürlich erkennen, wenn zu viele Listen durcheinander bearbeitet werden, wirds schwierig,
dann das ganze eher maschinell löschen, die Informationen an eine Verarbeitungsklasse leiten bzw. in der Liste selber
vor und nach dem Durchlaufen einen boolean setzen
(oder einen int-Zähler erhöhen wenn mehrere Durchläufe gleichzeitig stattfinden)

aus
'in Liste xy wird folgendes Objekt eingefügt ..'
wird dann
'in Liste xy wird folgendes Objekt eingefügt .. [ist ok, derzeit hat niemand ein for-Durchlauf angemeldet/ Achtung, for-Schleife läuft, gleich krachts]'


wenn man die fehlerhafte Stelle im Log gefunden hat, weiß man aber immer noch nicht ganz genau, wo das im Programm ist,
man kann bei den Ausgaben
new Error(string).printStackTrace();
ausführen um den Aufrufer zu erkennen
 

Der Müde Joe

Top Contributor
Wenn ich jetzt schätzen müsste:

Der Fehler ist sehr wahrscheinlich am gleichen Ort wie im letzen Thread ;-)

du übergibts die Liste (die immer noch List heisst und gross geschreiben ist).
in deiner detectHit-Methode und iterierst darüber. Jetzt machchst du set.
(letzes mal hast du dort removed nachdem lebenspunkte < 0).
Könnte es sein, dass du jetzt in der set-Methode removest ?
 

OliverKroll

Aktives Mitglied
Es wäre besser, immer das komplette Programm mit anzugeben.
Die ComodificationException tritt wie bereits gesagt auf, wenn eine Liste von zwei Programmstellen her verändert wird - beispielsweise von zwei Iteratoren.
Da du nun aber gesagt hast, daß in deinem Programm die Liste nur an einer Stelle verändert wird und zwar in public void run(), wäre das nächste, was zu prüfen ist, ob die run()-Thread mehrmals überlagernd aufgerufen wird (der zweite Aufruf erfolgt, bevor der erste Aufruf zuende ist).
Für diesen Fall fügst du hinzu: public synchronized void run().
 

System.exit(0)

Aktives Mitglied
Hallo zusammen,

danke für die Tipps,

@SlaterB

ich habe jetzt MyArrayList <MySprite> extends ArrayList <MySprite> kreiert.

Diese speichert den Namen der List und nach jedem get(i) den aufgerufenen Index und die aktuelle Größe.

Das mit den booleans habe ich noch nicht implementiert.

@Der muede Joe
in der detectHit Methode wird nur der Member LebensPunkte verändert.
Das Eliminieren der Spites erfolgt in einer späteren Methode.

@OliverKroll
das habe ich gemacht, mal sehen, ob der Fehler weiterhin auftritt.

an alle,

nochmals Danke

mfg

System.exit(0)
 

System.exit(0)

Aktives Mitglied
>Das Eliminieren der Spites erfolgt in einer späteren Methode.

Könnte es sein, dass das eliminieren in einem andere Thread läuft?
Somit itereiert der eine Thread über eine/die Liste und ein
andere eliminiert Objekte.

Also läuft diese Methode
http://www.java-forum.org/java-basi...44-bestimmte-elemente-arraylist-loeschen.html

in einem andere Thread?

Hallo

es gibt nur einen Thread in meinem Applet.
Die Mothode Run ruft dann die einzelnen Methoden auf.
Das Eliminiieren erfolgt in einer methode nachdem die Collision-detection gelaufen ist.
Es dürfte, meines Wissens nach, keinen zweiten Thread geben.

Gruß

System.exit(0)
 

System.exit(0)

Aktives Mitglied
ich bin meinen Code nochmals durchgegangen.

Ich glaube, die Ursache gefunden zu haben.
Im Main wird über den KeyListener die Tastatur abgefragt. Wird STRG gedrückt, wird der Collection myBullits ein Geschoss zugefügt.
Da dies event-getriggert ist, gehe ich davon aus, dass dieses Event dazu führt, dass während die Methode detectHit über die Collection myBullits iteriert, diese gerade ein neues Element bekommt.

Ich werde dies mit eienr Variablen boolean myBullitsinUse abfangen. Mal sehen, ob das klappt.

Gruß

System.exit(0)
 

Quaxli

Top Contributor
Das dürfte hinkommen. Ich kenne den Fehler von einer ähnlichen Problemstellung. Üblicherweise tritt er auf, wenn Du eine Collection veränderst, während gerade drüber "genudelt" wird. ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Fehler: <ID> erwartet Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
Pinhg Discord JDA Bot - Fehler Allgemeine Java-Themen 3
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
L Fehler mit Boolean. (Glaube ich zumindest) Allgemeine Java-Themen 6
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
O Fehler bei Variablen Allgemeine Java-Themen 2
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
C Fehler bei der Benutzung von itextpdf Allgemeine Java-Themen 1
U Fehler beim Compillieren Allgemeine Java-Themen 13
x46 String Format Fehler Allgemeine Java-Themen 2
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
MiMa Datei verschieben hat einen Fehler?? Allgemeine Java-Themen 20
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Fehler bei IF abfrage Allgemeine Java-Themen 8
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
M Einheitenrechner - Fehler Allgemeine Java-Themen 12
D Erste Schritte Fehler mit negativen und 0 Zahlen im String Allgemeine Java-Themen 6
T Denk-Fehler? Allgemeine Java-Themen 4
A Finde den Fehler nicht. Allgemeine Java-Themen 7
H Class 'java.io.BuferedReader' is not present in JRE Emulation Libary | GWT Fehler?! Allgemeine Java-Themen 0
D Unbekannter Fehler Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
L Fehler bei der Ausführung einer Jar Allgemeine Java-Themen 2
T OOP Fehler im Design Allgemeine Java-Themen 9
Thallius Unfassbarer Fehler. Brauche Ideen zum Debuggen Allgemeine Java-Themen 9
U Eclipse MANIFEST fehler Allgemeine Java-Themen 7
I Fehler bei HashMaps Darstellung Allgemeine Java-Themen 10
R Classnotfoundexception Fehler Allgemeine Java-Themen 3
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
N Compiler-Fehler Warum erhalte ich einen Nullpointer Fehler? Allgemeine Java-Themen 2
N Prim's Algorithm - wo ist der Fehler? Allgemeine Java-Themen 3
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
M Line-Fehler Allgemeine Java-Themen 8
U Input/Output Warum wirft mir das Programm diesen Fehler? Allgemeine Java-Themen 6
RalleYTN Merkwürdiger Fehler mit JFrame im Vollbild Allgemeine Java-Themen 4
V AudioInputStream Fehler Allgemeine Java-Themen 1
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
G Fehler mit Vector Allgemeine Java-Themen 3
F Java Fehler "buildTableModel" Allgemeine Java-Themen 3
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
DanielsLPecke Input/Output Arduino komischer Fehler. Allgemeine Java-Themen 38
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
S Hashtable Fehler Allgemeine Java-Themen 14
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
C Hilfe bei einer Fehler meldung Allgemeine Java-Themen 3
K Was ist mein Fehler? Allgemeine Java-Themen 2
Tausendsassa Compiler-Fehler Fertiges Programm mit Fehler Allgemeine Java-Themen 10
B Eclipse Nach Export einer .jar Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 5
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
P Java Fehler auf Win2008 Server java.io.FilePermission IE8 Version JRE 1.7.0_51 Allgemeine Java-Themen 7
M Eclipse - Fehler: Hauptklasse de.xyz.init.MeineKlasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
Seikuassi Swing Stehe auf dem Schlauch...(BufferedReader_Writer-Fehler?) Allgemeine Java-Themen 4
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
B Fehler bei einem Programm Allgemeine Java-Themen 10
F HILFEEEEEE JAVA Fehler - Tiny Umbrella Allgemeine Java-Themen 1
N JavaFX IndexOutOfBounds-Fehler Allgemeine Java-Themen 11
N GPIB - Fehler: Unable to open device Allgemeine Java-Themen 1
S Ganzes Programm "stucked" - JVM-Fehler? Allgemeine Java-Themen 2
D Variablen Ausgabe bzw. einlese Fehler Allgemeine Java-Themen 7
I Fehler java.lang.NullPointerException Allgemeine Java-Themen 5
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
B Eclipse Fehler in eclipse/Java Allgemeine Java-Themen 13
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0
J Fehler beim parsens eine Datums Allgemeine Java-Themen 3
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
J Compiler-Fehler .nextLine fehler Allgemeine Java-Themen 3
B Fehler im Java-Code Allgemeine Java-Themen 4
S Java Fehler bei Konsolenprogramm Allgemeine Java-Themen 2
N Was ist ein Fehler (Requirement-Engineering) Allgemeine Java-Themen 3
C System.out.print("") Compiler Fehler Allgemeine Java-Themen 2
T Programm bleibt ohne Fehler stehen Allgemeine Java-Themen 4
G Fehler beim instanzieren einer Generischen Klasse Allgemeine Java-Themen 5
K Eclipse Fehler beim Ausführen meines Programms in Eclipse Allgemeine Java-Themen 11
K Input/Output Fehler bei Dateierzeugung Allgemeine Java-Themen 7
M Fehler bei Remoteinstallation von Java Allgemeine Java-Themen 5
M Fehler bei Verwendung von TexturePaint Allgemeine Java-Themen 16
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
G Merkwürdiger Fehler NetBeans Allgemeine Java-Themen 2
G Native Library / Fehler beim Laden der .so/.dll Datei Allgemeine Java-Themen 17
P java tabelle auslesen - xls (excel) fehler Allgemeine Java-Themen 5
iB0T Unverständlicher Fehler Allgemeine Java-Themen 5
S Antlr Grammatik übersetzt ohne Fehler, dennoch wird Zahl nicht als Eingabe erkannt Allgemeine Java-Themen 4
S Fehler mit JScrollPane Allgemeine Java-Themen 4
K SimpleDateFormat Fehler Allgemeine Java-Themen 3
M import Fehler Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben