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

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

Patricia Arquette
Libérer: 2024-11-29 17:41:11
original
175 Les gens l'ont consulté

How to Avoid ConcurrentModificationException When Adding to an ArrayList?

Exception de modification simultanée : ajout à une ArrayList

L'exception ConcurrentModificationException est levée lorsque vous tentez de modifier une collection lors d'une itération dessus. Cette erreur se produit lorsque vous modifiez la collection en ajoutant ou en supprimant des éléments tout en la parcourant à l'aide d'un itérateur.

Cause de l'exception

Dans l'extrait de code fourni :

for (Iterator<Element> it = mElements.iterator(); it.hasNext();){
    Element element = it.next();

    // Code to check and add new elements
}
Copier après la connexion

Dans la boucle, le code tente d'ajouter de nouveaux éléments à la mElements ArrayList tout en itérant dessus à l'aide d'un Itérateur. Cela déclenche l'exception ConcurrentModificationException car la collection est modifiée lors de l'itération.

Solution 1 : utiliser une liste temporaire

Pour résoudre ce problème, vous pouvez utiliser une liste temporaire pour stocker les nouveaux éléments qui doivent être ajoutés à ArrayList. Après avoir terminé l'itération, vous pouvez ajouter les éléments de la liste temporaire à l'ArrayList.

// Create a new list to store any new elements that need to be added
List<Element> thingsToBeAdded = new ArrayList<>();

// Iterate over the mElements list
for (Iterator<Element> it = mElements.iterator(); it.hasNext();) {
    Element element = it.next();

    // Code to check and mark elements for addition (e.g., set cFlag)

    if (element.cFlag) {
        // Add the new element to the temporary list
        thingsToBeAdded.add(new Element("crack", getResources(), (int) touchX, (int) touchY));
        element.cFlag = false;
    }
}

// Add the new elements to the mElements list after finishing the iteration
mElements.addAll(thingsToBeAdded);
Copier après la connexion

Solution 2 : utiliser une boucle For-Each améliorée

Une Une autre approche consiste à utiliser une boucle for-each améliorée, qui offre un moyen plus sûr de parcourir une collection. La boucle for-each améliorée utilise une abstraction d'indirection pour garantir que la collection n'est pas modifiée pendant l'itération.

for (Element element : mElements) {
    // Code to check and modify elements (e.g., set cFlag)
}
Copier après la connexion

Dans ce cas, vous devrez mettre à jour le code qui ajoute de nouveaux éléments séparément après l'itération.

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