Iterator imbriqués et java.util.ConcurrentModificationException

Programmation Avancée

Moderator: douinj

Post Reply
douinj
Posts: 462
Joined: 18 Mar 2009 15:46

Iterator imbriqués et java.util.ConcurrentModificationException

Post by douinj » 15 Nov 2021 12:49

Bonjour, suite à la demande de l'un d'entre vous sur ce thème, vous trouverez ci-dessous une réponse avec un exemple

L'origine : diapositive 42 cours sur les collections http://lmi92.cnam.fr/nfp121/supports/NF ... ctions.pdf

ConcurrentModificationException est levée avec ce code

Code: Select all

        List<String> liste = new ArrayList<>();
        liste.add("NFP121");liste.add("Cnam");liste.add("Programmation");liste.add("Avancee");

        for(String s : liste){
            liste.remove("Cnam");
        }
La boucle foreach est traduite en interne par un itérator...
soit :

Code: Select all

 
        Iterator<String> it = liste.iterator(); 
        while(it.hasNext()){
            liste.remove(it.next());
        }
Or le remove utilise un itérateur cf. diapositive 51 alors ConcurrentModificationException

Une solution se passer de remove/1 alors pour ce code

Code: Select all

        Iterator<String> it = liste.iterator();
        while(it.hasNext()){
            it.next();
            it.remove();
        }
à suivre...

delaba_q
Posts: 26
Joined: 03 Oct 2021 0:47

Re: Iterator imbriqués et java.util.ConcurrentModificationException

Post by delaba_q » 15 Nov 2021 13:27

Et à partir de Java 8, liste.removeIf(s -> /* une condition */) qui s'appuie sur l'itérateur, en faisant disparaitre pour nous le détail d'implémentation !

zanvit_l
Posts: 4
Joined: 15 Nov 2021 19:48

Re: Iterator imbriqués et java.util.ConcurrentModificationException

Post by zanvit_l » 15 Nov 2021 19:54

Bonjour,

Merci pour vos réponses, j'avais en effet finis par comprendre que mon foreach ne pouvait pas fonctionner du fait que je compromettais l'intégrité de la pile de la manière dont je procédais.
J'ai trouvé qu' avec un simple for mais en parcourant la pile de la fin vers le début, je ne risquais donc pas de compromettre son intégrité et risquer de créer une ModificationException.

Post Reply