Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException

BigMemo007

Aktives Mitglied
Hallo liebe Gemeinde,

habe das Spiel Snake nachprogrammiert. Damit die Schlange nach jedem Fressen Aufsammeln wachsen kann, wird in eine ArrayList ein neues Schwanzteil hinzugefügt. Dort werden auch die Koordinaten der Schwänze festgehalten. Es gibt - glaube ich- drei Threads, die auf diese ArrayList zugreifen. Einmal meine GameClock - eigenes Thread -, die nach einem Fressen die Methode addTail aufruft. Dann das Haupthread, die x- und y- Koordinate für die Bewegung der Schlange anpasst. Und zum Schluss mein Draw Thread für das Zeichnen in meinem Fenster. Meine Draw-Klasse erweitert JLabel und überschreibt die paintComponent(Graphics g) Methode.

So, ich glaube die o. g. Exception kommt, weil mind. 2 Threads zur gleichen Zeit auf die ArrayList zugreifen wollen. Das geht wohl nicht. Die Draw-Klasse hat repaint(), so dass sie vielleicht 1000 mal in der Sekunde ausgeführt wird und die GameClock stoppt alle 200 Milisekunden. Mein HauptThread greift auf die ArrayList per Aufruf, so dass es nicht so häufig passiert. Ich vermute, dass der Fehler deswegen meistens ab 30 Aufsammeln auftritt.


Das ist der gesamte Fehlerlauf:
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1012)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:966)
at gui.MyDraw.paintComponent(MyDraw.java:40)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5255)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedFPScales(RepaintManager.java:1707)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1616)
at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5203)
at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5013)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:865)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Ich habe versucht in meiner MyDras-Klasse (oben fett markiert), folgende synchronisation zu machen:

Java:
g.setColor(new Color(51,204,51));
        synchronized (MySnake.tails) {
            for (MyTail t : MySnake.tails) {
                g.fillRect(MyKoordinate.xPoint(t.getX()), MyKoordinate.yPoint(t.getY()), MyFrame.feldGr,
                        MyFrame.feldGr);
            }
        }

Trotzdem ist der Fehler aufgetaucht. Wie kann ich meine Synchronisation so setzen, dass der Fehler nicht mehr passiert?

Oder soll ich in der MyDraw-Klasse eine neue Array-List erstellen, die eine Kopie der originalen ist? D.h. die x- und y-Werte werden in der Originalen gesetzt, die Kopie-ArrayList holt sich die Werte von der originalen, und die for-Schleife zum Zeichnen greift auf die Kopie, dass es ein gleichzeitiger Doppelaufruf einer ArrayList nicht geben kann.

Oder liege ich mit meiner Vermutzung absolut falsch, dass der Fehler wegen gleichzeitigem Zugriff auf die ArrayList MySnake.tails entseht?

Lieben Dank :))
 
K

kneitzel

Gast
Das ist richtig: Der Fehler tritt auf, weil die ArrayList verändert wird, während diese durchlaufen wird. Das ist etwas, das eine ArrayList nicht mag.

Das Problem solltest Du beheben können, indem Du beim Durchlaufen der Liste einen Iterator nutzt. Der verkraftet meines Wissens nach die Veränderungen.

Wenn Du es per Stream machst, sollte es auch funktionieren, aber das habe ich so noch nicht getestet. Also sowas wie:
MySnake.tails.stream().forEach(t ->g.fillRect(MyKoordinate.xPoint(t.getX()), MyKoordinate.yPoint(t.getY()), MyFrame.feldGr, MyFrame.feldGr));
und wenn dann die List verändert wird, gibt es keine Exception. Wäre ggf. ein Test wert.

Das ist jetzt aber einfach mal so im Forum zusammen gedacht und nichts getestet oder so... Tippfehler sind also möglich ...
 

httpdigest

Top Contributor
Das Problem solltest Du beheben können, indem Du beim Durchlaufen der Liste einen Iterator nutzt.
Nein. Er nutzt ja einen Iterator mit der enhanced for-loop. Und dieser wirft auch die ConcurrentModificationException.
(hint: die enhanced for-loop (oder auch foreach-loop) ist nur syntaktischer Zucker für eine Schleife, die einen Iterator eines Iterable durchläuft).
 

httpdigest

Top Contributor
Ich habe versucht in meiner MyDras-Klasse (oben fett markiert), folgende synchronisation zu machen:
Java:
g.setColor(new Color(51,204,51));
        synchronized (MySnake.tails) {
            for (MyTail t : MySnake.tails) {
                g.fillRect(MyKoordinate.xPoint(t.getX()), MyKoordinate.yPoint(t.getY()), MyFrame.feldGr,
                        MyFrame.feldGr);
            }
        }
Wenn du es mit synchronized lösen willst, dann reicht das alleine ja nicht.
Du musst auch überall dort, wo du die Liste änderst, auf dasselbe Objekt synchronisieren. Ein synchronized-Block sorgt dafür, dass zu jedem Zeitpunkt nur ein einzelner Thread den Monitor des im synchronized genannten Objektes bekommen kann und den Block betreten kann.
Wenn du nur in deiner paintComponent() Methode auf das Objekt synchronisierst, dann können trotzdem soviele Threads wie möglich das Objekt ändern, da sie sich ja vermutlich nicht auch auf das Objekt synchronisieren.
 
K

kneitzel

Gast
Nein. Er nutzt ja einen Iterator mit der enhanced for-loop. Und dieser wirft auch die ConcurrentModificationException.
(hint: die enhanced for-loop (oder auch foreach-loop) ist nur syntaktischer Zucker für eine Schleife, die einen Iterator eines Iterable durchläuft).
Hast natürlich Recht. Wenn man schnell etwas schreiben will ohne sich da Zeit nehmen zu können, dann kommt so ein Müll raus.

Das mit dem Iterator kann nur das Löschen eines Elements in der Schleife lösen, weil der Iterator auch eine remove Operation bietet (Optional, also je nach Implementation kann das auch nicht implementiert sein!) Aber das ist hier ja auch nicht der Fall, daher war die Antwort natürlich komplett unsinnig.
 

BigMemo007

Aktives Mitglied
Danke für die Antworten.

Seit dem ich statt der for-each Schleife eine normale for-Schleife nutze, tauchte das Problem nicht mehr auf. Die Synchronisation habe ich komplett rauagenommen. Kann natürlich bis jetzt Zufall gewesen sein.ich werde es beobachten.

Also, statt
Java:
for (MyTail t : MySnake.tails) {
   // abarbeiten
}

dies hier
Java:
for (int i=0; i < MySnake.tails.getSize(); i++) {
  //abarbeiten
}

Entschuldigt bitte, wenn ich mich kurz fasse oder Fehler drin hab. Ich schreibe gerade mit meinem Android Devise.
 

mrBrown

Super-Moderator
Mitarbeiter
Seit dem ich statt der for-each Schleife eine normale for-Schleife nutze, tauchte das Problem nicht mehr auf. Die Synchronisation habe ich komplett rauagenommen. Kann natürlich bis jetzt Zufall gewesen sein.ich werde es beobachten.

Der Fehler wird nicht mehr geworfen – das zugrundeliegende Problem, das Ändern der Liste während du sie benutzt, ist aber weiterhin vorhanden. Anstatt der deutlich Exception wird das aber jetzt zu Fehlern an anderer Stelle führen, deren Ursprung dann nicht mehr so leicht zu finden ist.
 
B

BestGoalkeeper

Gast
das zugrundeliegende Problem, das Ändern der Liste während du sie benutzt, ist aber weiterhin vorhanden
Nö. Anstatt vorwärts zu laufen, einfach schreiben:
Java:
for (int i = tails.size() - 1; i >= 0; i--) {
	// abarbeiten
	if (tails.get(i) == 0) {
		tails.remove(i);
	}
}
führt zu überhaupt keinen Problemen und ist standardmäßiges Vorgehen...
 

mrBrown

Super-Moderator
Mitarbeiter
Nö. Anstatt vorwärts zu laufen, einfach schreiben:
Java:
for (int i = tails.size() - 1; i >= 0; i--) {
    // abarbeiten
    if (tails.get(i) == 0) {
        tails.remove(i);
    }
}
führt zu überhaupt keinen Problemen und ist standardmäßiges Vorgehen...
Nein, du hast nur nicht verstanden, was das Problem ist.
Die Liste wird von zwei Threads gleichzeitig bearbeitet, nicht innerhalb der iteration selbst wird die Liste verändert. Dabei ist’s völlig egal, in welche Richtung man läuft, je nach ausgeführter Aktion gib ne IndexOutOfBoundException oder man bearbeitet zu viele/zu weniger Elemente.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
C Exception in thread "AWT-EventQueue-0 Java Basics - Anfänger-Themen 15
M Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 7
1 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException Java Basics - Anfänger-Themen 5
J Datentypen Exception in thread "AWT-EventQueue-0"?? Java Basics - Anfänger-Themen 4
Spin Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: data must Java Basics - Anfänger-Themen 10
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
J Exception in thread "main" Java Basics - Anfänger-Themen 1
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Compiler-Fehler Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 2
F Exception in thread main java.lang.StackOverflowError Java Basics - Anfänger-Themen 3
A Compiler-Fehler Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 7
T Problem mit Eclipse? Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 4
M Exception in thread "main" java.lang.NoClassDefFoundError: MeineKlasse Java Basics - Anfänger-Themen 12
S Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 11
S Umgebungsvariable Exception in thread "main" java.lang.UnsatisfiedLinkError: no J3D in java.librar y.path Java Basics - Anfänger-Themen 15
M Klassen Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 2
D Exception in thread "main" Java Basics - Anfänger-Themen 8
A Exception in thread "main" Java Basics - Anfänger-Themen 7
A Exception aus Thread werfen Java Basics - Anfänger-Themen 14
S Exception in thread "main" Java Basics - Anfänger-Themen 3
B Exception in thread "main" java.lang.NullPointerException Fehler Hilfe! Java Basics - Anfänger-Themen 4
T Thread 2x starten verursacht Exception Java Basics - Anfänger-Themen 3
L Bubblesort: Exception in Thread "main" Java Basics - Anfänger-Themen 5
Y Exception in thread Java Basics - Anfänger-Themen 11
A Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 16
A GELÖST -- Exception in thread "main" Java Basics - Anfänger-Themen 3
B Fehlermeldung - Exception in thread "main" java.lang.Error: Unresolved compilation pr Java Basics - Anfänger-Themen 16
E Fehler: "Exception in thread "main" java.lang.NoSuchMethodError" Java Basics - Anfänger-Themen 15
G Fehler: Exception in thread main java.lang.noClassDefFound Java Basics - Anfänger-Themen 7
L Exception in thread "main" java.util.NoSuchElement Java Basics - Anfänger-Themen 4
A Do/While Problem (Exception in thread "main" java. Java Basics - Anfänger-Themen 4
M "exception in thread "main" java.lang.NullPoi Java Basics - Anfänger-Themen 2
S Exception in thread "main" java.lang.UnsupportedCl Java Basics - Anfänger-Themen 4
P Exception in thread "main" Java Basics - Anfänger-Themen 4
O java.lang.NoClassDefFoundError Exception in thread "mai Java Basics - Anfänger-Themen 5
V Exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 21
S Exception in thread "main" java.lang.NoSuchMethodE Java Basics - Anfänger-Themen 3
S Exception in thread Java Basics - Anfänger-Themen 7
NightmareVirus Exception in thread "main" java.lang.NoSuchMethodE Java Basics - Anfänger-Themen 8
A "Exception in thread "main" java.lang.NoCLass Java Basics - Anfänger-Themen 10
N exception in thread main . Java Basics - Anfänger-Themen 3
A Exception in thread "Thread-33" java.lang.NoClassD Java Basics - Anfänger-Themen 10
C Exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 9
vogella Exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 4
F Fehlermeldung: Exception in thread. Java Basics - Anfänger-Themen 17
R Exception in thread "main" java.lang.NoSuchMethodE Java Basics - Anfänger-Themen 6
C exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 7
A Fehlermeldung: Exception in thread "main" java.lan Java Basics - Anfänger-Themen 3
H Exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 3
G Exception in thread Java Basics - Anfänger-Themen 9
R Exception in Thread "main" . Kommandozeile/Netbean Java Basics - Anfänger-Themen 8
L Exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 4
R Exception in thread "main" java.lang.NullPointerEx Java Basics - Anfänger-Themen 10
B Exception in thread "main"... Java Basics - Anfänger-Themen 3
H exception in thread mainjava.lang.noclass ... Java Basics - Anfänger-Themen 3
L Exception in thread "main" java.lang.NoSuchMethodE Java Basics - Anfänger-Themen 3
K Exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 8
J Exception in thread "main" java.langClassNoFoundEr Java Basics - Anfänger-Themen 2
H Exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 5
B Fehler: Exception in Thread "main" java.lang.NoCla Java Basics - Anfänger-Themen 2
G Exception in thread "main" java.lang.NoClassDefFou Java Basics - Anfänger-Themen 2
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
Fiedelbambu Exception in Application constructor Java Basics - Anfänger-Themen 3
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
F abbruch Exception lässt sich nicht erstellen Java Basics - Anfänger-Themen 2
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
LiFunk Exception: es dürfen nur Nummern eingelesen werden Java Basics - Anfänger-Themen 6
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
1 Exception Java Basics - Anfänger-Themen 2
I JAX-RS Exception Handling Java Basics - Anfänger-Themen 4
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
J null exception Array Java Basics - Anfänger-Themen 5
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
C Exception-Frage Java Basics - Anfänger-Themen 3
I Exception bei Button mit wait() und notifyAll() Java Basics - Anfänger-Themen 3
N Wie teste ich eine geworfene Exception? Java Basics - Anfänger-Themen 8
R Methoden ArrayList clonen wirft exception Java Basics - Anfänger-Themen 3
D Scanner- Exception NoSuchElementException Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben