Heim >Java >javaLernprogramm >Wie vermeide ich ConcurrentModificationException beim Hinzufügen zu einer ArrayList während der Iteration?
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.
java.util.ConcurrentModificationException
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.
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);
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!