Was ist ConcurrentModificationException in Java?
Beispiel
Schauen wir uns ein Beispiel an, wie diese Ausnahme auftritt.import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver1 {
public static void main(String[] args) {
List<String> businessDays = new ArrayList<>();
businessDays.add("Monday");
businessDays.add("Tuesday");
businessDays.add("Wednesday");
businessDays.add("Thursday");
businessDays.add("Friday");
businessDays.add("Saturday");
businessDays.add("Sunday");
Iterator<String> iterator = businessDays.iterator();
while (iterator.hasNext()) {
String day = iterator.next();
if (day.equals("Sunday")) {
// removing a list item while iterating
// leading to java.util.ConcurrentModificationException
businessDays.remove(day);
}
}
}
}
Ausgabe
Ausnahme im Thread „main“ java.util.ConcurrentModificationException bei java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) bei java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) bei meilenstein.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)
Wie vermeide ich ConcurrentModificationException in Java?
Es gibt verschiedene Problemumgehungen für die ConcurrentModificationException . Hier sind einige eingetragen. Sie können sich je nach Bedarf für jeden entscheiden.- Vermeiden Sie Änderungen während der Iteration.
- Verwenden Sie herkömmliche Schleifen für gleichzeitige Iteration und Änderung.
- Erstellen Sie eine Kopie der zu ändernden Werte, während Sie Iteratoren verwenden. Aktualisieren Sie die Werte, sobald die Iteration beendet ist.
Beispiel
Hier ist ein Beispiel dafür, wie Sie die ConcurrentModificationException vermeiden können .import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver2 {
public static void main(String[] args) {
List<String> businessDays = new ArrayList<>();
businessDays.add("Monday");
businessDays.add("Tuesday");
businessDays.add("Wednesday");
businessDays.add("Thursday");
businessDays.add("Friday");
businessDays.add("Saturday");
businessDays.add("Sunday");
System.out.println("Initial Business Days: " + businessDays);
// Method II - Using traditional for loop
for (int i = 0; i < businessDays.size(); i++) {
if (businessDays.get(i).equals("Sunday")) {
businessDays.remove(i);
}
}
Iterator<String> iterator = businessDays.iterator();
List<String> businessDaysToBeRemoved = new ArrayList<>();
// Method III - Creating a copy of elements
while (iterator.hasNext()) {
String day = iterator.next();
if (day.equals("Saturday")) {
// Add values to be removed in the list
businessDaysToBeRemoved.add(day);
}
}
businessDays.removeAll(businessDaysToBeRemoved);
System.out.println("Final Business Days: " + businessDays);
}
}
Ausgabe
Erste Geschäftstage: [Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag] Letzte Geschäftstage: [Montag, Dienstag, Mittwoch, Donnerstag, Freitag]
GO TO FULL VERSION