Maison >Java >javaDidacticiel >Comment éviter ConcurrentModificationException lors de l'ajout à une ArrayList pendant l'itération ?
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).
java.util.ConcurrentModificationException
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.
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);
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!