Heim > Java > javaLernprogramm > Wie vermeide ich ConcurrentModificationException beim Ändern einer ArrayList während der Iteration?

Wie vermeide ich ConcurrentModificationException beim Ändern einer ArrayList während der Iteration?

Mary-Kate Olsen
Freigeben: 2024-11-30 20:25:13
Original
935 Leute haben es durchsucht

How to Avoid ConcurrentModificationException When Modifying an ArrayList During Iteration?

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;
    }
}
Nach dem Login kopieren

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 );
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren
verhindert

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage