java.util.ConcurrentModificationException vermeiden

Zur Ausgabe von Listen eignen sich foreach-Schleifen besonders gut. Man sollte jedoch vermeiden, innerhalb eines foreach-Blocks die Liste zu modifizieren, da die Datenstruktur der Liste während der Iteration für Veränderungen gesperrt ist. Ein Hinzufügen oder Löschen von Elemente führt somit zur java.util.ConcurrentModificationException.

Beispiel:

1
2
3
4
for (String id : playLists.keySet()){
  PlayList playList = playLists.get(id);
  playLists.remove(id); // causes java.util.ConcurrentModificationException
}

Ein Workaround besteht darin, sich während der Iteration die IDs (die man löschen möchte) in einer weiteren Liste zwischenzuspeichern und dann über diese Liste zum Löschen zu iterieren.

Beispiel:

1
2
3
4
5
6
7
8
9
10
ArrayList<String> removeIds = new ArrayList<>();
 
for (String id : playLists.keySet()){
  PlayList playList = playLists.get(id);
  removeIds.add(id);
}
 
for (String id : removeIds){
  playLists.remove(id);
}

2 Gedanken zu „java.util.ConcurrentModificationException vermeiden“

  1. … und anstelle ein zweites mal ein Schleifenkonstrukt zu schreiben ginge auch playLists.removeAll(removeIDs)

  2. Sehr guter Beitrag, vielen Dank! Ich habe das nur mit einem zweiten Schleifenkonstrukt gemacht, damit man auch komplexere Löschmethoden vornehmen kann (z.B. jedes zweite Element löschen oder Element löschen, wenn es keinen Titel hat, etc.). Für die Aufgabe „alle löschen“, ist deine Methode aber ganz klar im Vorteil!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.