IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

ConcurrentModificationException dans une List


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 10
    Points
    10
    Par défaut ConcurrentModificationException dans une List
    Bonjour tout le monde.

    J'ai un petit problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    import java.util.*;
     
    class Thing { // simple classe qui contient un entier
    	private int i;
    	public Thing(int i) { this.i = i; }
    	public String toString() {return "Thing " + i;}
    }
     
    public class Test2 {
    	public static void main(String[] args) {
     
    		List<Thing> lt = new ArrayList<Thing>(); // création et remplissage d'une List
    		for(int i=0; i<6; i++) lt.add(new Thing(i));
     
    		List<Thing> sub = lt.subList(2, 5); // on prend une sous-liste
    		System.out.println(sub);
    		lt.removeAll(sub); // et on la retire de la liste d'origine, ça foire ici
    	}
    }
    J'ai fait ce programme basique et il me génère une ConcurrentModificationException .....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    [Thing 2, Thing 3, Thing 4]
    Exception in thread "main" java.util.ConcurrentModificationException
       at java.util.AbstractList$SubList.checkMod(libgcj.so.10)
       at java.util.AbstractList$SubList.listIterator(libgcj.so.10)
       at java.util.AbstractList.listIterator(libgcj.so.10)
       at java.util.AbstractList$SubList.iterator(libgcj.so.10)
       at java.util.AbstractCollection.contains(libgcj.so.10)
       at java.util.ArrayList.removeAllInternal(libgcj.so.10)
       at java.util.AbstractCollection.removeAll(libgcj.so.10)
       at Test2.main(Test2.java:18)
    J'ai regardé dans la javadoc, ce genre d'exception est générée quand on utilise un iterator,
    ce que je ne fais pas (en tout cas pas de façon apparente) ici.
    quequ'un peut-il (elle) m'aider à résoudre le mystère?
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Cela n'arrive pas seulement avec les Iterators, mais le principe est un peu le même. Tout comme les Iterators, subList() retourne une vue sur la liste et non pas une copie.

    Ces vues sont modifiables, et les modifications sont alors reportées sur la liste principale.

    Par contre, les modifications sur la liste ne sont pas reporté sur les vues et provoque une ConcurrentModificationException. Ce choix est volontaire et permet d'avoir un code "fail-fast" (littéralement : qui plante rapidement). L'intérêt étant de ne pas utiliser de code qui pourrait entrainer des problèmes aléatoires.

    Il n'est pas impossible de gérer des modifications dans les deux sens, mais c'est assez compliqué et il est fort probable que plusieurs cas particulier ne soit pas géré. Pour éviter ce genre de problème les vues génèrent une exception dès qu'elles détectent une modification sur la collection liée...

    Cela permet de rencontrer le problème très tôt en développement, et donc de prendre directement la meilleure solution !


    Comme toujours dans ces cas là, la solution consiste à effectuer les modifications sur la vues. Elles seront automatiquement reportées sur la liste. Dans ton cas cela revient à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        List<Thing> sub = lt.subList(2, 5); // on prend une sous-liste
        System.out.println(sub);
        sub.clear(); // et on la retire de la liste d'origine

    a++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    OKKAAAYYY !!!!!

    Je vois clair maintenant.
    Un grand merci à toi adiGuba pour cette réponse rapide et claire !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/04/2010, 11h15
  2. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20
  3. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09
  4. Réponses: 2
    Dernier message: 17/08/2003, 20h07
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo