ConcurrentModificationException warum ?

florian.

Mitglied
Hallo !
Ich bin neu hier in diesem Forum und habe eine Frage: Warum bekomme ich hier eine ConcurrentModificationException ?
Java:
for(Spiel aSpiel : aktuelleSpiele)	//<------ Hier: ConcurrentModificationException
	{
                int a = 0;
		try
		{		
			int tipp1 = Integer.parseInt(tipps.get(a).getText());			//Tipp1 bekommen
			a ++;
		        int tipp2 = Integer.parseInt(tipps.get(a).getText());			//Tipp2 bekommen
			a ++;
			aktuellerSpieler.addTipp(new Tipp(tipp1, tipp2, aSpiel));			//Neuen Tipp fuer aktuellen Spieler setzen
		}
			catch(NumberFormatException ex)
			{
			JLabel err = new JLabel("Bitte gueltige ganze Zahlen eingeben !");
			panel2.add(err);
			frame.add(panel2);
			frame.setVisible(true);
		        }
	}

Es geht um ein TippSpiel-Programm und die Exception kommt in der markierten Zeile.

Falls ihr zu Beantwortung der Frage das hier braucht:

xception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at me.florianpfisterer.tippspiel.TippSpiel$SaveTippsListener.actionPerformed(TippSpiel.java:465)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Vielen Dank schonmal !
gruß Florian
 
Zuletzt bearbeitet:
Die Exception sagt aus, dass während der Ausführung der Schleife ein anderer (oder auch der selbe Thread) die Liste verändert hat. D.h. meistens steckt der "Fehler" ganz wo anders als die Exception herkommt.
Als mögliche Fehlerstelle im eigenen Thread kommt nur addTipp in Frage, machst du das irgendwas mit der Liste? Ansonsten: was für Threads laufen noch und wo greifen die auf die Liste zu?
 
Danke für die Antwort erstmal.

Als mögliche Fehlerstelle im eigenen Thread kommt nur addTipp in Frage, machst du das irgendwas mit der Liste?

Mit dieser Liste mache ich eigentlich nichts:
Java:
public void addTipp(Tipp t)
	{
		tipps.add(t);         //ArrayList in der Klasse Spieler
		tspiele.remove(t.getSpiel());     //ArrayList in der Klasse Spieler
	}

Mit Threads kenne ich mich ehrlich gesagt nicht besonders gut aus. Aber ich verändere ja nichts mit der Liste "aktuelleSpiele" ?
 
Ist "aktuelleSpiele" die gleiche Liste wie "tspiele"? Das ist wahrscheinlich der Fehler. Du kannst nicht einfach sagen, dass man über eine Liste von 300 Elemente iterieren soll und dann löscht du mittendrin einfach einen raus.
 
Zuletzt bearbeitet:
im Prinzip ja aber aktuelleSpiele wird erst danach aktualisiert (auf Basis von tSpiele).
aber danke für den Hinweis, ich schau mir das nochmal genauer an.

und @strußi: stimmt, noch ein Fehler. Danke !
 
So sieht es jetzt aus (auch mit der aktuelleSpiele-Aktualisierung):
Java:
for(Spiel aSpiel : aktuelleSpiele)			//fuer jedes angezeigte Spiel
			{
				try
				{
					int tipp1 = Integer.parseInt(tipps.get((aktuelleSpiele.indexOf(aSpiel))).getText());	//Tipp1 bekommen
					int tipp2 = Integer.parseInt(tipps.get((aktuelleSpiele.indexOf(aSpiel) + 1)).getText());	//Tipp2 bekommen
					aktuellerSpieler.addTipp(new Tipp(tipp1, tipp2, aSpiel));			//Neuen Tipp fuer aktuellen Spieler setzen
				}
				catch(NumberFormatException ex)
				{
					JLabel err = new JLabel("Bitte gueltige ganze Zahlen eingeben !");
					panel2.add(err);
					frame.add(panel2);
					frame.setVisible(true);
				}
			}
			aktuelleSpiele = aktuellerSpieler.getTSpiele();		//aktuelleSpiele aktualisieren
			genGUI(false);

Aktualisierung passiert aber nach Schleife
 
Zuletzt bearbeitet:
Ist "aktuelleSpiele" die gleiche Liste wie "tspiele"? Das ist wahrscheinlich der Fehler. Du kannst nicht einfach sagen, dass man über eine Liste von 300 Elemente iterieren soll und dann löscht du mittendrin einfach einen raus.

aber du hast recht, komischerweise funktioniert es wenn ich
Java:
tspiele.remove(t.getSpiel());
auskommentiere.

Okay, vielen Dank jetzt funktioniert es !
 
Zuletzt bearbeitet:

Zurück
Oben