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

Collection et Stream Java Discussion :

[Collection] ConcurrentModificationException


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut [Collection] ConcurrentModificationException
    Voila j'ai un probleme d'exception en fait je l'ai une fois sur deux ...la premiere iteration marche mais l exception est generee ensuite, je ne sais pas comment la virer...Elle intervient lorsque j'ai une array list d'ecouteur d'evenement que je parcour avec un iterator afin de dispatcher les messages ( en fait il y a un seul ecouteur ) l'action effectué par cet ecouteur est un update ui.. a la premiere iteration pas de pb tout se passe bien lors de la deuxieme il ya une exception de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.util.ConcurrentModificationException
    qui est generée. J'ai lu , dans la java doc par ex, que cet evenement etait generer lorsqu'on faisait une modification d'un item qui se trouve dans un iterator mais la je ne veux que mettre a jour mon affichage si vous avez une solution je vous remercie pour votre aide.. :

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    peux-tu envoyer un bout de code???

  3. #3
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Tu dois faire 2 acces concurrents sur tes collections.
    Si tu parcours ta collection et en meme temps tu lui rajoute, supprime ou modifie des elements ca pose probleme...
    Ce que tu peux faire c'est créer une copie de ta collection pour la parcourir et faire les changement dans ta veritable collection.
    Mais sans bout de code c'est chaud de te donner une solution
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    ben c'aurait ete avec grand plaisir mais je sais pas si ca va etre tres utile parceque c'est un probleme assez globale donc il va falloir que je fasse une selection de code et je sais pas si cela sera suffisant mais je vais essayer... en tout cas merci de t'interesser a mon pb..

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    je me rend bien compte que c difficile sans code je vais essayer alors d'etre le plus clair possible dans ma selection de code
    voila dans un premier temps j'appelle cette methode depuis l'objet qui recoit l'evenement et qui se trouve dans l'objet generateur d'evenement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void addNoeud(TreePath loca,Itec nouveau){
       try{
         Itec temp = (Itec) loca.getLastPathComponent();
         temp.addModule(nouveau);
         this.data2=this.rootItec.getNivo(nivo);
         fireTableChanged();
         fireTreeChanged(loca);
       }catch(Exception e){
         System.out.println("exception"+e);
       }
    // fireTreeChanged(loca);
     }
    il appelle la methode fireTreeChanged

    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
    21
    22
    23
    public  void  fireTreeChanged(TreePath loca){
       try {
         List malist=Collections.synchronizedList(treeModelListeners);
         synchronized(malist){
           ListIterator iterator = malist.listIterator();
           Object tmp;
           while (iterator.hasNext()) {
             tmp = iterator.next();
             if (tmp instanceof TreeModelListener) {
               //TreeModelListener listener = (TreeModelListener) iterator.next();
               TreeModelListener listener = (TreeModelListener) tmp;
               TreeModelEvent tme = new TreeModelEvent(this, loca);
               //listener.treeNodesChanged(new TreeModelEvent(this, loca));
               listener.treeNodesChanged(tme);
             }
             else {
               // System.out.println("ERREUR DE CAST ln 94 ModelPrincipal");
             }
           }
         }
       } catch (Exception ex) {
         ex.printStackTrace();
       }
    a partir de cette methode on retourne dans l'objet qui avait invoqué la methode add noeud et qui se trouve dans la liste des listener et on realise l'operation suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void Insert_ActionPerformed(TreeModelEvent e){
    try{
          this.updateUI();
        }catch(Exception j){
          j.printStackTrace();
        }
     
      }
    Voila j'espere avoir été clair mais j'en suis pas sur

  6. #6
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    La classe Vector etant synchronisee, elle pourrait peut-etre regler ton probleme sans que tu ai besoin de changer quoi que ce soit ...

    Sinon tu peux essayer de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List liste = Collections.synchronizedList(tonArrayList);
    Et utiliser l'objet liste pour parcourir ton ArrayList ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    Ben Vector j'ai deja essayer ca marcher pas c pour ca que je suis passer sur une ArrayList en plus ce qui me gene un peu avec Vector c'est que selon la java doc elle va etre deprecated....merci pour ta reponse en tout cas. Mais si j'ai synchroniser ma liste ca devrait etre bon non?

  8. #8
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (iterator.hasNext()) { 
             tmp = iterator.next(); 
             if (tmp instanceof TreeModelListener) {  
               TreeModelListener listener = (TreeModelListener) tmp; 
               TreeModelEvent tme = new TreeModelEvent(this, loca); 
               listener.treeNodesChanged(tme);
    Je pense que le probleme vient du fait que tu fais treeNodesChanged(tme) en meme temps que tu parcours ta liste de listener... Quand tu fais un treeNodesChanged tout les listener sur cette liste sont "appelé" par java donc ca provoque un acces concurrent (enfin je crois ).
    Si tu peux sortir de ton while avant d'appeler treeNodesChanged, devrait plus y avoir de probleme.
    Si tu peux pas, fais ton parcours sur une copie de maList, comme ca tu travaille sur une liste séparée; apres pour l'appel de treeNodesChanged il faut que tu recupere le bon element (maList.get(position du treeModelListener) et tu lui applique le nodesChanged.

    Ca a l'air assez chiant mais bon...
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    merci narfigoo c'est sympa de ta part je vais essayer, mais c'est bizarre qd mem non? c pourtant bien le principe des listener ca devrait marcherje l'ai deja fait plusieurs fois sans pb sinon comment je peux faire une copie de ma liste?

  10. #10
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Essaye a peu pres ca : (il se peut u'il y est qques erreurs mais l'idée y est )
    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
    21
    22
    23
    24
    public  void  fireTreeChanged(TreePath loca){ 
       try { 
         List malist=Collections.synchronizedList(treeModelListeners);
         List malistCopie = new ArrayList();
         malistCopie.addAll(maList);
         synchronized(malistCopie){ 
           ListIterator iterator = malistCopie.listIterator(); 
           Object tmp; 
           while (iterator.hasNext()) { 
             tmp = iterator.next(); 
             if (tmp instanceof TreeModelListener) {
               //tu recup le listener de la vrai list            
               TreeModelListener listener = (TreeModelListener) (maList.get(iterator.previousIndex() + 1)); 
               TreeModelEvent tme = new TreeModelEvent(this, loca); 
               listener.treeNodesChanged(tme); 
             } 
             else { 
               // System.out.println("ERREUR DE CAST ln 94 ModelPrincipal"); 
             } 
           } 
         } 
       } catch (Exception ex) { 
         ex.printStackTrace(); 
       }
    Un truc dans ce genre
    "Quand le sage montre la lune,
    L'idiot regarde le doigt."

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    ok ca marche merci beaucoup

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

Discussions similaires

  1. [EJB3] ConcurrentModificationException collection list multi-thread jboss
    Par gudepier42 dans le forum Java EE
    Réponses: 1
    Dernier message: 10/05/2010, 13h09
  2. [Collection] ConcurrentModificationException - Conseils
    Par TylerKnoxx dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 24/01/2008, 22h38
  3. [VB6] la collection controls
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 30/04/2003, 17h03
  4. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49

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