ConcurrentModificationException beim Ändern einer ArrayList während der Iteration
Die gemeldete Ausnahme ist eine ConcurrentModificationException, die aus dem Versuch stammt, eine ArrayList, mElements, while zu ändern iteriert darüber.
In einem OnTouchEvent-Handler gibt es eine Schleife, die mit einem Iterator über mElements iteriert, um auf bestimmte Bedingungen zu prüfen:
for (Iterator<Element> it = mElements.iterator(); it.hasNext();){ Element element = it.next(); // Check element's position and other conditions... if(element.cFlag){ mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); // ConcurrentModificationException occurs here element.cFlag = false; } }
Das Ändern der ArrayList (durch Hinzufügen eines neuen Elements) während der Iteration mit einem Iterator kann jedoch zu einer ConcurrentModificationException führen.
Lösung:
Um diese Ausnahme zu vermeiden, besteht eine Möglichkeit darin, eine zu erstellen Separate Liste zum Speichern von Elementen, die hinzugefügt werden müssen, und zum Anhängen dieser an die Hauptliste nach Abschluss der Iteration:
List<Element> thingsToBeAdd = new ArrayList<Element>(); for(Iterator<Element> it = mElements.iterator(); it.hasNext();) { Element element = it.next(); // Check element's position and other conditions... if(element.cFlag){ // Store the new element in a separate list for later addition thingsToBeAdd.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); element.cFlag = false; } } // Add all elements from the temporary list to the main list mElements.addAll(thingsToBeAdd );
Alternativer Ansatz:
Ein anderer Ansatz ist Verwenden Sie eine erweiterte for-each-Schleife, die eine Kopie der Liste durchläuft und so ConcurrentModificationException:
for (Element element : mElements) { // Check element's position and other conditions... if(element.cFlag){ mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); // No ConcurrentModificationException element.cFlag = false; } }
Das obige ist der detaillierte Inhalt vonWie vermeide ich ConcurrentModificationException beim Ändern einer ArrayList während der Iteration?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!