# LinkedList-checkForComodification



## new123 (7. Mrz 2012)

Hallo,
ich habe ein Problem mit einer Fehlermeldung:



> Exception   in thread "main" java.util.ConcurrentModificationException
> at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:953)
> at java.util.LinkedList$ListItr.next(LinkedList.java:886)
> at Praktomat.storeCorrection(Praktomat.java:691)
> ...



zu folgendem Code:


```
LinkedList<Correction> corrections;
Correction actualCor = new Correction(taskId, mN, mark, correction);

if (containsCorrection(taskId, mN)) {
        index = -1;
	for (Correction cor : corrections) {    //Hier kommt die Fehlermeldung:      Praktomat.storeCorrection(Praktomat.java:691)
	      if (cor.getId() == taskId && cor.getmN() == mN) {
		index = corrections.indexOf(cor);	
		if (index >= 0) {
		   corrections.remove(index);
		   corrections.add(actualCor);
		}
	      }
	}
} else {
  corrections.add(actualCor);
}
```

Ich habe eine Liste mit Korrekturen, wenn eine Korrektur schon vorhanden ist (containsCorrection),
soll diese Korrektur überschrieben werden. Dazu muss ich die alte Korrektur rauslöschen(die ich anhand vom Index gesucht habe) und mit der neuen übergebenen Korrektur überschreiben.

Habt ihr eine Idee, wo der Fehler sein könnte.

Falls noch Code zum Verständnis fehlt, einfach Bescheid geben!

Vielen Dank schon einmal!


----------



## Gossi (7. Mrz 2012)

new123 hat gesagt.:


> ```
> corrections.remove(index);
> corrections.add(actualCor);
> ```



Ist dein Fehler, du kannst/darfst eine Collection nicht verändern, während du über sie iterrierst.

Eine Lösung habe ich allerdings grad net zur Hand...


----------



## x22 (7. Mrz 2012)

Das stimmt so nicht ganz.

Wenn du diesen iterator nimmst:


```
Iterator<String> it = land.iterator();
		while (it.hasNext()) {
		    String value = it.next();
		    if (value.startsWith("D")) {
		        it.remove();
	
		    }
```

kannst du während du iterriest was ändern.


----------



## pg1337 (7. Mrz 2012)

x22 hat gesagt.:


> Das stimmt so nicht ganz.
> 
> Wenn du diesen iterator nimmst:
> 
> ...




Das fast gleiche Beispiel hatte ich auch mal mit Städten.
Da kann man was verändern @TO


----------



## Gossi (7. Mrz 2012)

Stimmt, dann veränderst du auch den Iterator und nicht die Collection mit der der Iterator verbunden ist


----------



## x22 (7. Mrz 2012)

Bei dem iterator würde es dir praktisch alle Länder entfernen aus der Liste, die mit D anfangen.


----------



## new123 (7. Mrz 2012)

Wäre es dann so richtig: ?


```
for (Correction cor : corrections) {
	if (cor.getId() == taskId && cor.getmN() == mN) {
		index = corrections.indexOf(cor);	
		}
	}
corrections.remove(index);
corrections.add(actualCor);
```

ich bin mir nicht sicher, ob ich richtig verstanden hab, was ihr gemeint habt...
muss ich meine komplette methode ändern, weil ich die so nicht anwenden kann 
oder reicht es einfach, wenn ich das .remove und .add aus der for-schleife nehme?


----------



## x22 (7. Mrz 2012)

Nein.. du iterierst in deinem Beispiel mit einer erweiterten for-Schleife,
brauchst aber nen Iterator, so wie ich ihn als Pseudo-Code gepostet habe.

Ausserhalb der Schleife geht das so nicht.


----------



## Gossi (7. Mrz 2012)

new123 hat gesagt.:


> ich bin mir nicht sicher, ob ich richtig verstanden hab, was ihr gemeint habt...
> muss ich meine komplette methode ändern, weil ich die so nicht anwenden kann
> oder reicht es einfach, wenn ich das .remove und .add aus der for-schleife nehme?



Wenn du nur einen einzigen eintrag suchst und diesen dann löschen willst, kannst du es auch so schreiben:


```
for (Correction cor : corrections) {
	if (cor.getId() == taskId && cor.getmN() == mN) {
		index = corrections.indexOf(cor);
		break;
	}
}
corrections.remove(index);
corrections.add(actualCor);
```

Durch das break; wird die for-Schleife dann verlassen.


----------



## new123 (7. Mrz 2012)

ah okay! super vielen dank!
habt mit sehr weitergeholfen!


----------



## x22 (7. Mrz 2012)

Gossi hat gesagt.:


> Durch das break; wird die for-Schleife dann verlassen.



man beachte bitte, dass ich das Wort "so" benutzt habe, nicht dass hier wieder eine Diskussion entsteht:



x22 hat gesagt.:


> Ausserhalb der Schleife geht das so nicht.




Wollt ihm nur n Tipp geben, aber break ist ja auch in Ordnung.
Nur wird schwer, wenn er eben mehr Elemente, wie bei meinem Pseudo code, rauslöschen will.


Edit: Dann solltest du das so machen wie ich es geschrieben habe @TO.


----------



## Gossi (7. Mrz 2012)

x22 hat gesagt.:


> man beachte bitte, dass ich das Wort "so" benutzt habe, nicht dass hier wieder eine Diskussion entsteht:
> 
> *Darauf hätte ich auch keine Lust ^^*
> 
> ...



Richtig, meine Lösung löscht *NUR DAS ERSTE GEFUNDENE ELEMENT*, willst du mehr als ein Objekt ändern, musst du den Code von x22 nehmen, oder dir was ganz unschönes basteln


----------

