7 Stimmen

Java, ArrayList und Exception im Thread "AWT-EventQueue-0" java.util.ConcurrentModificationException

Ich durchlaufe eine ArrayList. Wenn ich den alten Weg benutze:

for (int i = 0; i < list.size(); i++)
{
    list.get(i).update();;
}

läuft es in Ordnung. Aber mit diesem:

for (Baseitem item : list)
{
    item.update();
}

scheitert es in der ersten Zeile, innerhalb der ArrayList-Klasse: Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException ja, draußen entferne ich Elemente - aber sicherlich nicht während der Iteration. Wie löse ich das? Ich verwende keine Threads.

14voto

eternay Punkte 3636

Sie sollten vermeiden, Elemente in einer Liste zu ändern, während Sie diese Liste durchlaufen.

Mit der for (int i...) Schleife durchlaufen Sie nicht die Liste, so dass Sie die Elemente darin ändern können.

In der for (Baseitem item : list) Schleife durchlaufen Sie die Liste, so dass die Modifikation der Elemente der Liste die Ausnahme ConcurrentModificationException auslösen wird.

Sie müssen die erste Form der Schleife verwenden, wenn Sie die Elemente darin ändern möchten.

2voto

António Almeida Punkte 8965

Dies ist mir passiert, weil ich eine Schleife benutzte, um alle Elemente einer Liste zu entfernen.

Beispiel Kunden: [1, 2, 3]

for(int i=0 ; i<kunden.size() /* 3 */ ; i++)
    kunden.remove(kunden.get(i));

i wird 0, 1 und 2 sein, aber beim dritten Durchlauf (i=2) wird es kein kunden[2] geben, daher kommt es zu ConcurrentModificationException.


Wie man das Problem vermeiden kann:

while(kunden.size() > 0)
    kunden.remove(0);

1voto

Mubin Punkte 4142

Eine wichtige Anmerkung zu for-each:

Die for-each-Schleife wird sowohl mit Kollektionen als auch mit Arrays verwendet. Sie soll die am häufigsten verwendete Form der Iteration vereinfachen, bei der der Iterator oder der Index ausschließlich zur Iteration verwendet wird und nicht für andere Arten von Operationen, wie das Entfernen oder Bearbeiten eines Elements in der Kollektion oder im Array. Wenn es eine Wahl gibt, sollte die for-each-Schleife der for-Schleife vorgezogen werden, da sie die Lesbarkeit erhöht.

In Ihrem Fall ist die Verwendung des Iterators vorzuziehen.

Können Sie auch die update() Methode von Baseitem posten?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X