Maison >Java >javaDidacticiel >Comment éviter ConcurrentModificationException lors de l'ajout à une ArrayList pendant l'itération ?

Comment éviter ConcurrentModificationException lors de l'ajout à une ArrayList pendant l'itération ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-07 04:32:15926parcourir

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

Exception de modification simultanée : ajout à une ArrayList

Problème

Une application rencontre une ConcurrentModificationException lors de la modification d'une ArrayList (mElements) dans une méthode OnTouchEvent. Le code parcourt les mElements à l'aide d'un itérateur et, lors d'événements tactiles spécifiques, tente d'ajouter un nouvel élément à la liste. Cela se produit dans un bloc synchronisé (mElements).

Exception

java.util.ConcurrentModificationException

Cause

L'exception ConcurrentModificationException se produit parce que l'ArrayList est en cours de modification (en ajoutant des éléments) alors qu'elle est étant parcouru à l’aide d’un itérateur. Les itérateurs s'attendent à ce que la collection sous-jacente reste inchangée pendant l'itération. Cependant, l'ajout d'éléments à la liste pendant l'itération viole cette attente.

Solution

Pour résoudre l'exception, il est nécessaire d'ajouter les nouveaux éléments à la liste une fois l'itération terminée. Ceci peut être réalisé en utilisant une liste supplémentaire pour contenir les nouveaux éléments et en les ajoutant à la liste principale mElements après l'itération.

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);

Option supplémentaire

Comme alternative à la solution ci-dessus , pensez à utiliser la syntaxe de boucle for-each améliorée, qui évite le besoin d'un itérateur et gère la synchronisation en interne :

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

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!

Déclaration:
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