Maison > Java > javaDidacticiel > Comment éviter ConcurrentModificationException lors de la modification d'une ArrayList pendant l'itération ?

Comment éviter ConcurrentModificationException lors de la modification d'une ArrayList pendant l'itération ?

Mary-Kate Olsen
Libérer: 2024-11-30 20:25:13
original
929 Les gens l'ont consulté

How to Avoid ConcurrentModificationException When Modifying an ArrayList During Iteration?

ConcurrentModificationException lors de la modification d'une ArrayList pendant une itération

L'exception signalée est une ConcurrentModificationException, provenant de la tentative de modification d'une ArrayList, mElements, tandis que en itérant dessus.

Dans un gestionnaire OnTouchEvent, il y a une boucle itérant sur mElements à l'aide d'un Iterator pour vérifier des conditions spécifiques :

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;
    }
}
Copier après la connexion

Cependant, modifier ArrayList (en ajoutant un nouvel élément) lors d'une itération à l'aide d'un Iterator peut provoquer une ConcurrentModificationException.

Solution :

Pour éviter cette exception, un L'option consiste à créer une liste distincte pour stocker les éléments qui doivent être ajoutés et à les ajouter à la liste principale après avoir terminé l'itération :

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 );
Copier après la connexion

Approche alternative :

Une autre approche consiste à utiliser une boucle for-each améliorée, qui parcourt une copie de la liste, empêchant 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;
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal