didoux95
Messages postés845Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 1 août 2017
-
13 mai 2007 à 12:45
cheplu
Messages postés16Date d'inscriptionvendredi 2 février 2007StatutMembreDerniè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)
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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();
}
}
cheplu
Messages postés16Date d'inscriptionvendredi 2 février 2007StatutMembreDerniè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.
didoux95
Messages postés845Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 1 août 20172 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);
}
}