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