ConcurrentModificationException

Status
Nicht offen für weitere Antworten.

Strolch

Mitglied
Ok, kurze Einführung: Ich bzw wir (noch ein anderer Student + ich) arbeiten an einem Restaurant-Manager Projekt mit Hibernate und haben ein kleines Problem. In einer unserer Klassen kommt es zu "sporadischen" java.util.ConcurrentModificationException. Sporadisch heißt, das sie manchmal auftreten und manchmal nicht.

Das Problem tritt in der actionPerformed-Mehode auf. Wir benutzen Eclipse als Entwicklungsumgebung. Die Zeile, an die uns das Eclipse "führt" in der Exception habe ich gekennzeichnet. Hier ein kurzer Auszug:

Code:
	public void actionPerformed(ActionEvent event) {
		
		String befehl = event.getActionCommand();
		
		if (befehl.equals("mitarbeiterHinzufügen")){
			
			Set mitarbeiter = new HashSet();
			mitarbeiter = restaurant.getPerson();

			// ...		
		}
		
		if (befehl.equals("mitarbeiterLoeschen")){	
			
			if (mitarbeiterListe.getSelectedValue() != null){

				Set mitarbeiter2 = new HashSet();
				mitarbeiter2 = restaurant.getPerson();
				Iterator i2 = mitarbeiter2.iterator();
				while (i2.hasNext()){
					Person person = (Person) i2.next();	// Fehler!!!
					if(mitarbeiterListe.getSelectedValue().equals(person.getNachName())){
						mitarbeiter2.remove(person);
						}
				}
			// ...
			}
		}
		
		if (befehl.equals("zuTageskarteAdden")){
			
			if(produktListe.getSelectedValue() != null){
				Tageskarte tageskarte = restaurant.getTageskarte();
				Set tageskarteProdukte = new HashSet();
				tageskarteProdukte = tageskarte.getProdukt();
				Set produkte = restaurant.getProdukt();
				Iterator i = produkte.iterator();
				while (i.hasNext()){
					Produkt produkt = (Produkt) i.next();	 //Fehler!!!
					if(produktListe.getSelectedValue().equals(produkt.getName())){
						tageskarteProdukte.add(produkt);
					}
				}
			//...
			}
		}
			
		if (befehl.equals("ausTageskarteLoeschen")){
			
			if(aktuelleTageskarte.getSelectedValue() != null){
				Tageskarte tageskarte = restaurant.getTageskarte();
				Set produkte = new HashSet();
				produkte = tageskarte.getProdukt();
				Iterator i = produkte.iterator();
				while (i.hasNext()){
					Produkt produkt = (Produkt) i.next(); // Fehler!!!
					if (aktuelleTageskarte.getSelectedValue().equals(produkt.getName())){
						zuloeschendesProdukt = produkt;
						produkte.remove(produkt);
					}
				}
			//...
			}
		}
		
		
		if (befehl.equals("zutatLoeschen")){
			
			if (zutatenList.getSelectedValue() != null){
				Set zutaten2 = new HashSet();
				zutaten2 = restaurant.getZutat();
				Iterator i = zutaten2.iterator();
				while (i.hasNext()){
					Zutat zutat = (Zutat) i.next(); // Fehler
					if(zutatenList.getSelectedValue().equals(zutat.getName())){
						zutaten2.remove(zutat);
					}
				}
			// ...
			}
		}
}

Ok, noch n kurzer Auszug aus der Exception:
Code:
java.util.ConcurrentModificationException
	at java.util.HashMap$HashIterator.nextEntry(HashMap.java:782)
	at java.util.HashMap$KeyIterator.next(HashMap.java:818)
	at net.sf.hibernate.collection.PersistentCollection$IteratorProxy.next(PersistentCollection.java:437)
	at rmSystem.BossUI.actionPerformed(BossUI.java:708)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
	...

Ich kann mir gut vorstellen, das die Exception kommt, weil ich mehr als 1 mal ein Set von Produkten, Mitarbeitern bzw. Zutaten aus unserem Restaurant hole. Ich dachte jedoch immer, das wären dann neue Sets und die Iteratoren würden sich nicht gegenseitig "behindern".

Ich will jetzt nicht die unbedingt eine Lösung haben, aber vielleicht mal einen Denkansatz, wie und warum das ganze entsteht und wie wir es vielleicht ändern können. Leider muss die ganze Sache bis Mittwoch fertig sein. :roll:

MfG
 

semi

Top Contributor
The iterators returned by all of this class's "collection view methods"
are fail-fast: if the map is structurally modified at any time after
the iterator is created, in any way except through the iterator's own
remove or add methods
, the iterator will throw a
ConcurrentModificationException. Thus, in the face of concurrent
modification, the iterator fails quickly and cleanly, rather than risking
arbitrary, non-deterministic behavior at an undetermined time in the
future.
Klartext: Es geht nur gut, solange man einen einzelnen Iterator
auf einmal verwendet. Der erste, der eine Änderung von "aussen"
feststellt, zickt.
 

citizen_erased

Bekanntes Mitglied
du kannst nicht die datenstruktur modifizieren, die du gleichzeitig durchschreitest.
das ist wie ein blinder auf einen steg, dem man sagt, er sollte auf jede einzelne holzleiste treten, um vorwärts zu kommen. und während er läuft, entfernt man einige der leisten...

erstelle eine kopie, so dass du zwei objekte hast. nun könnte man das eine durchlaufen und in der anderen modifizieren:

Code:
           Vector org = new Vector();
           org.add("1");
           org.add("2");
           org.add("3");
           org.add("4");
           org.add("5");
           
           Iterator it = org.iterator();
           Vector copy = new Vector();
           copy.addAll(org);
           while (it.hasNext()) {
               Object tmp = it.next();
               if (tmp.toString().equals("2")) {
                   copy.remove(tmp);
               }
           }
           org = copy;

am ende weisst du dem orgiinal die arbeitskopie zu
 

Strolch

Mitglied
Ok, ich hab das, was mir citizen_erased vorgeschlagen hat, mal probiert. Und es geht nicht. :( Aber, ich hab den Fehler selbst gefunden, und das ganze geändert. :D Anstatt auf ein HashSet zu schreiben, schreib ich jetzt in 2 HashSets. :)

Code:
	HashSet alteMitarbeiter  = new HashSet();
	alteMitarbeiter.addAll(mitarbeiterListe);
	Iterator i = alteMitarbeiter.Iterator();
	HashSet neueMitarbeiter = new HashSet();
	while (i.hasNext()){
		Mitarbeiter mitarbeiter = (Mitarbeiter) i.next();
		if(mitarbeiter.getName().equals("Meier")){
			//alteMitarbeiter.remove(mitarbeiter);	//stand früher da
										//hier kam der Fehler, weil halt das HashSet mit dem 
										//Iterator i in der Schleife geändert wurde
		}
		else{
			neueMitarbeiter.add(mitarbeiter);
		}
	}
	mitarbeiterListe = neueMitarbeiter;

Danke für eure Hilfe!

Seltsamerweise geht es, etwas zu einem Set hinzuzufügen, aber nichts zu löschen.

Code:
	HashSet alteMitarbeiter  = new HashSet();
	Iterator i = alteMitarbeiter.Iterator();
	while (i.hasNext()){
		Mitarbeiter mitarbeiter = (Mitarbeiter) i.next();
		if(mitarbeiter.getName().equals("Meier")){
			alteMitarbeiter.remove(mitarbeiter);		//funktioniert nicht
			alteMitarbeiter.add(mitarbeiter);		//funktioniert aber
		}
	}

Nur mal so nebenbei. ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ConcurrentModificationException Allgemeine Java-Themen 2
D java.util.ConcurrentModificationException tritt auf Allgemeine Java-Themen 12
F ConcurrentModificationException warum ? Allgemeine Java-Themen 7
K Collections java.util.ConcurrentModificationException Allgemeine Java-Themen 3
N ConcurrentModificationException Allgemeine Java-Themen 2
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
D java.util.ConcurrentModificationException - per Copy vermeiden Allgemeine Java-Themen 11
D java.util.ConcurrentModificationException bei ArrayList Allgemeine Java-Themen 2
F ConcurrentModificationException Allgemeine Java-Themen 2
P Vectoren bearbeiten: ConcurrentModificationException Allgemeine Java-Themen 4
B ConcurrentModificationException Allgemeine Java-Themen 3
G ConcurrentModificationException - finds nicht Allgemeine Java-Themen 5
S Fehler ConcurrentModificationException Allgemeine Java-Themen 8
R java.util.ConcurrentModificationException vermeiden? Allgemeine Java-Themen 8
R ConcurrentModificationException Allgemeine Java-Themen 9
D ConcurrentModificationException nicht nachvollziehbar Allgemeine Java-Themen 8
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
J java.util.ConcurrentModificationException bei HashMap? Allgemeine Java-Themen 2
G ConcurrentModificationException Allgemeine Java-Themen 4
E ConcurrentModificationException Allgemeine Java-Themen 6
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
P java.util.ConcurrentModificationException Allgemeine Java-Themen 9
M ConcurrentModificationException Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben