Elements List

Résolu
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 - 13 mai 2007 à 12:45
cheplu Messages postés 16 Date d'inscription vendredi 2 février 2007 Statut Membre Dernière intervention 1 juillet 2007 - 13 mai 2007 à 15:02
Bonjour a tous.


j'utilise l'api JDom pour traiter le fichiers XML. pour supprimer un element, JDom n'a pas de mtehode particuliere, il suffit de creer une List et de supprimer l'element desire de cette List. Le problieme et que lorsque je suprimme l'lement en question, j'obtien une exception.

le code:
//Class AddDeleteE
   //On parcour le fichier.
   List listElements = racine.getChildren();
   Iterator i = listElements.iterator();
   while (i.hasNext()) {  //ligne 238
    Element courant = (Element)i.next();
    //On récupère le nom de l'élément courant et on le teste
    if (courant.getAttributeValue("nom").equals(nom)){
     listElements.remove(courant);
    }
   }

l'exception
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException


        at org.jdom.ContentList$FilterListIterator.checkConcurrentModification(ContentList.java:1041)
        at org.jdom.ContentList$FilterListIterator.hasNext(ContentList.java:752)


        at AddDeleteE.supprimer(AddDeleteE.java:328)
        at AddDeleteE$1.actionPerformed(AddDeleteE.java:138)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)


        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)


        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)


        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

merci de votre aide.

3 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
13 mai 2007 à 12:58
On ne peux pas utiliser un Iterator et supprimer des éléments de la collection que l'on itère.

Du coup :

Iterator i = listElements.iterator();
while (i.hasNext()) {
    Element courant = (Element)i.next();
    //On récupère le nom de l'élément courant et on le teste
    if (courant.getAttributeValue("nom").equals(nom)){
         listElements.remove(courant);
         i = listElements.iterator();
    }
}
3
cheplu Messages postés 16 Date d'inscription vendredi 2 février 2007 Statut Membre Dernière intervention 1 juillet 2007
13 mai 2007 à 15:02
Pour supprimer un element d'une liste que l'on itère, la meilleure solution est d'utuliser la methode iterator.remove().
En utilisant la methode list.remove, tu modifie la taille de ta liste ce qui peut être dangereux dans certaines utlisations. Avec la methode iterator.remove(), tu n'auras jamais de soucis.
3
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
13 mai 2007 à 13:59
merci.

Donc, pour ceux que ca interesse (on sait jamais), voila le code modifié:
code :

   //On parcour le fichier.
   List listElements = racine.getChildren();
   for (int a=0; a<listElements.size(); a++) {
    Element courant = (Element)listElements.get(a);
    //On récupère le nom de l'élément courant et on le test
    if (courant.getAttributeValue("nom").equals(nom)){
     listElements.remove(courant);
    }
   }
0
Rejoignez-nous