Heim >Java >javaLernprogramm >Wie vermeide ich ConcurrentModificationException beim Hinzufügen zu einer ArrayList während der Iteration?

Wie vermeide ich ConcurrentModificationException beim Hinzufügen zu einer ArrayList während der Iteration?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-07 04:32:15922Durchsuche

How to Avoid ConcurrentModificationException When Adding to an ArrayList During Iteration?

Concurrent Modification Exception: Hinzufügen zu einer ArrayList

Problem

Eine Anwendung stößt auf eine ConcurrentModificationException, wenn sie eine ArrayList (mElements) innerhalb einer OnTouchEvent-Methode ändert. Der Code iteriert mithilfe eines Iterators über mElements und versucht bei bestimmten Berührungsereignissen, der Liste ein neues Element hinzuzufügen. Dies geschieht innerhalb eines synchronisierten (mElements)-Blocks.

Ausnahme

java.util.ConcurrentModificationException

Ursache

Die ConcurrentModificationException tritt auf, weil die ArrayList währenddessen geändert wird (durch Hinzufügen von Elementen). wird mit einem Iterator durchlaufen. Iteratoren erwarten, dass die zugrunde liegende Sammlung während der Iteration unverändert bleibt. Das Hinzufügen von Elementen zur Liste während der Iteration verstößt jedoch gegen diese Erwartung.

Lösung

Um die Ausnahme zu beheben, müssen die neuen Elemente nach Abschluss der Iteration zur Liste hinzugefügt werden. Dies kann erreicht werden, indem eine zusätzliche Liste verwendet wird, um die neuen Elemente zu speichern und sie nach der Iteration zur Hauptliste von mElements hinzuzufügen.

List<Element> thingsToBeAdd = new ArrayList<Element>();
for (Iterator<Element> it = mElements.iterator(); it.hasNext(); ) {
    Element element = it.next();
    // ...
    if (element.cFlag) {
        thingsToBeAdd.add(new Element("crack", getResources(), (int) touchX, (int) touchY));
        element.cFlag = false;
    }
}
mElements.addAll(thingsToBeAdd);

Zusätzliche Option

Als Alternative zur oben genannten Lösung Erwägen Sie die Verwendung der erweiterten for-each-Schleifensyntax, die die Notwendigkeit eines Iterators vermeidet und die Synchronisierung intern übernimmt:

for (Element element : mElements) {
    // ...
    if (element.cFlag) {
        thingsToBeAdd.add(new Element("crack", getResources(), (int) touchX, (int) touchY));
        element.cFlag = false;
    }
}
mElements.addAll(thingsToBeAdd);

Das obige ist der detaillierte Inhalt vonWie vermeide ich ConcurrentModificationException beim Hinzufügen zu einer ArrayList während der Iteration?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn