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