"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment éviter la conception concurrente de la conception lors de la modification d'une liste de listes pendant l'itération?

Comment éviter la conception concurrente de la conception lors de la modification d'une liste de listes pendant l'itération?

Publié le 2025-03-22
Parcourir:731

How to Avoid ConcurrentModificationException When Modifying an ArrayList During Iteration?

ConcurrentModificationException en conception tout en modifiant une arrayList pendant itération

L'exception rapportée est un siération en conception, issue de la tentative de modification d'un arraylist, Melements, tout en itérant sur. Loop itération sur les mels à l'aide d'un itérateur pour vérifier les conditions spécifiques:

pour (iterator it = mements.iterator (); it.hasnext ();) {{ Élément élément = it.next (); // Vérifiez la position de l'élément et d'autres conditions ... if (element.cflag) { mements.add (nouvel élément ("crack", getResources (), (int) touchx, (int) touchy)); // ConcurrentModificationException se produit ici element.cflag = false; } }

for (Iterator 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;
    }
}

list thingStobeadd = new ArrayList (); for (iterator it = mements.iterator (); it.hasnext ();) { Élément élément = it.next (); // Vérifiez la position de l'élément et d'autres conditions ... if (element.cflag) { // Stockez le nouvel élément dans une liste séparée pour un ajout ultérieur ThingStobeadd.add (nouvel élément ("crack", getResources (), (int) touchx, (int) touchy)); element.cflag = false; } } // ajouter tous les éléments de la liste temporaire à la liste principale melements.addall (ThingStOBeadd);

approche alternative:

Une autre approche consiste à utiliser une boucle for-out améliorée, qui itère sur une copie de la liste, élément conurrentModificationException:

List thingsToBeAdd = new ArrayList();
for(Iterator 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 );
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3