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

Java Discussion :

Erreur java util.ConcurrentModificationException


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Août 2007
    Messages : 86
    Points : 46
    Points
    46
    Par défaut Erreur java util.ConcurrentModificationException
    Bonjour,
    Mon programme bloque au niveau d'une fonction et me donne l'exception suivante java.util.ConcurrentModificationException,
    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
     
    private ArrayList<Cellule> getARBdeClassei(int i, ArrayList<Cellule> ab) {
     
    		ArrayList<Cellule> cellules2 = new ArrayList<Cellule>();
     
    		for (Cellule c: ab)
    		{			
    			if(i == c.getClasse())
    			{
    				cellules2.add(c);
    			}
    			else 
    			{
    			arb.delete(c); // exception 			
    			}
    		}
     
    		Collections.sort(cellules2,EnsembleCellule.resourceComparator);
    		return cellules2;
    	}
    Je ne sais pas pourquoi j'ai cette exception alors que je ne modifie pas la liste que je parcours ab.

    merci pour votre aide.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Points : 100
    Points
    100
    Par défaut
    Est ce que tu peux poster la totalité de ta classe et la stack d'erreurs ?

  3. #3
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Août 2007
    Messages : 86
    Points : 46
    Points
    46
    Par défaut
    pour l'erreur voilà:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    	at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    	at java.util.AbstractList$Itr.next(Unknown Source)
    	at sia.AIRS.getARBdeClassei(AIRS.java:263)
    	at sia.AIRS.CompetitionRessource(AIRS.java:197)
    	at sia.AIRS.SelectionnerCelluleCandidate(AIRS.java:118)
    	at sia.AIRS.<init>(AIRS.java:98)
    	at sia.Classification$3.actionPerformed(Classification.java:93)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.AbstractButton.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    voilà la fonction qui utilise la fonction getARBdeClassei

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private Cellule CompetitionRessource(Antigene ag) {
     
    		Cellule CellPlusStimule=null;		
    		// normaliser et calculer les ressurce pour chaque ARB
    		ArrayList<Cellule> AB= NormalisationStimulation(arb.getCellules(),ag);
    		double ressource= 0;
    		// recuperer toute les ARB de la calsse i
    		ArrayList<Cellule> ABi= getARBdeClassei(ag.getClasse(),AB);	
    	        ...
    		...			
    		return CellPlusStimule;
    	}
    la fonction NormalisationStimulation() génère la liste que je parcoures

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    private ArrayList<Cellule> NormalisationStimulation(
    			ArrayList<Cellule> cellules2, Antigene ag) {
     
    		double min = Double.POSITIVE_INFINITY;
    		double max = Double.NEGATIVE_INFINITY;
     
    		// determine min and max
    		for(Cellule c : cellules2)
    		{
    			double s = fonctionAffinite.stimulation(c, ag);		
     
    			if(s < min)
    			{
    				min = s;
    			}
    			if(s > max)
    			{
    				max = s;
    			}
    		}
     
    		// normalise
    		double range = (max - min);		
    		for(Cellule c : cellules2)
    		{
    		    double s = c.getStimulation();
    		    double normalised = (s-min) / range;		    
    		    c.setStimulation(normalised);		    
     
    		    // validation
    		    if(normalised<0 || normalised>1)
    		    {
    		        throw new RuntimeException("Normalised stimulation outside range!");
    		    }
    		}
     
     
     
    		return cellules2;
    	}
    et arb est un objet de la classe EnsembleCellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class EnsembleCellule implements Serializable{
     
     
    	protected final ArrayList<Cellule> cellules;
    	 int numAttribut=8;
     
     
    	public EnsembleCellule(ArrayList<Cellule> cells)
    	{
    		 cellules= cells;
     
    	}
    }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Points : 100
    Points
    100
    Par défaut
    tu passe en paramètre de la méthode NormalisationStimulation l'objet la liste arb.cellules. Cette méthode retourne la même liste que tu références dans AB. Donc AB et arb.cellules sont un même objet. Dans la boucle de la méthode "getARBdeClassei" tu parcours l'objet arb.cellules.

  5. #5
    Membre averti Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Points : 390
    Points
    390
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected final ArrayList<Cellule> cellules;
    Quand tu déclares une liste avec final tu ne peux pas y ajouter ou y supprimer un élément (si mes souvenirs sont bons). C'est un mécanisme de la programmation concurrente, comme le montre d'ailleurs ton message d'erreur.

    Est ce qu'il y a de réelles motivations qui justifient l'usage de final ?

  6. #6
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Août 2007
    Messages : 86
    Points : 46
    Points
    46
    Par défaut
    merci, j'avais pas fait attention.
    Il m'a suffit de déclarer une autre liste AB dans NormalisationStimulation et copier les Cellule.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    private ArrayList<Cellule> NormalisationStimulation(
    			ArrayList<Cellule> cellules2, Antigene ag) {
     
    		double min = Double.POSITIVE_INFINITY;
    		double max = Double.NEGATIVE_INFINITY;
    		ArrayList<Cellule> AB = new ArrayList<Cellule>();
     
    		// determine min and max
    		for(Cellule c : cellules2)
    		{
    			double s = fonctionAffinite.stimulation(c, ag);		
     
    			if(s < min)
    			{
    				min = s;
    			}
    			if(s > max)
    			{
    				max = s;
    			}
    		}
     
    		// normalise
    		double range = (max - min);		
    		for(Cellule c : cellules2)
    		{
    		    double s = c.getStimulation();
    		    double normalised = (s-min) / range;		    
    		    c.setStimulation(normalised);		    
    		    	AB.add(c);	    
    		    // validation
    		    if(normalised<0 || normalised>1)
    		    {
    		        throw new RuntimeException("Normalised stimulation outside range!");
    		    }
    		}
     
     
     
    		return AB;
    	}

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par _Xavier_ Voir le message
    Quand tu déclares une liste avec final tu ne peux pas y ajouter ou y supprimer un élément
    Attention, quand le mot clé final est appliqué à un attribut de type objet, c'est la référence qui devient constante (on ne peut peut pas luis affecter un autre objet), et non sa valeur. On peut donc ajouter des éléments dans une liste même si elle est déclarée avec le mot clé final.

  8. #8
    Membre averti Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Points : 390
    Points
    390
    Par défaut
    Citation Envoyé par igor24 Voir le message
    On peut donc ajouter des éléments dans une liste même si elle est déclarée avec le mot clé final.
    On peut ajouter mais on ne peut pas supprimer c'est ça ?
    Tu l'as bien essayé ?

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    ConcurrentModificationException c'est quand on parcourt une Collection et qu'on la modifie en même temps. C'est pas possible (sauf en utilisant Iterator.remove() et ListIterator.insert().)

    Apparemment, tu parcours ta List dans une boucle for, et tu fais aussi un Collection.remove() dessus (à l'intérieur de arb.delete() je suppose.) Cela est défendu et aura un résultat aléatoire. Java essaie autant que possible de lancer une ConcurrentModificationException dans ces cas-là, pour que tu te rendes compte qu'il y a un problème.

    Citation Envoyé par _Xavier_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected final ArrayList<Cellule> cellules;
    Quand tu déclares une liste avec final tu ne peux pas y ajouter ou y supprimer un élément (si mes souvenirs sont bons).
    Tes souvenirs te trompent. Ça veut dire qu'on ne peut pas assigner la variable à nouveau, autrement dit on ne peut pas lui assigner une autre ArrayList. Mais la liste elle-même reste parfaitement modifiable, et de toute façon ConcurrentModificationException n'a juste rien à voir avec ce genre de question. Ça a à voir avec une modification concurrente, ce qui n'est pas autorisé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre averti Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Points : 390
    Points
    390
    Par défaut
    Ça a à voir avec une modification concurrente, ce qui n'est pas autorisé.
    Merci de la précision.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/06/2015, 16h48
  2. Erreur "java.util.ConcurrentModificationException"
    Par Krisiun dans le forum Langage
    Réponses: 8
    Dernier message: 02/11/2013, 22h53
  3. Message d'erreur : java.util.ConcurrentModificationException
    Par leara500 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 02/02/2013, 15h47
  4. Erreur au niveau de java.util.ConcurrentModificationException
    Par Namson dans le forum Général Java
    Réponses: 1
    Dernier message: 01/06/2009, 09h41

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