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

Langage Java Discussion :

ConcurrentModificationException et AbstractList


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Emilie MARQUOIS-OGEZ
    Femme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 80
    Par défaut ConcurrentModificationException et AbstractList
    Bonjour à tous,

    Lorsque je lance mon programme j'ai l'erreur suivante : java.util.ConcurrentModificationException

    Voici la partie du code qui pose 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    private void processNewMessage(Message message) {
    	float probaLect;
    	float q = SimVirtCom.getNextRandomFloat(); 
    	Theme themeMess = message.getTheme();
    	Member auteur = message.getMember();
    	float levelRepKmemb = levelRepK.getLevelForThemeAndMember(themeMess, this);
    	float levelRepKauteur = levelRepK.getLevelForThemeAndMember(themeMess, auteur);
     
    if (this.getAuteursMessagesLus().size() == 0) {
    	this.getMessagesLus().add(message);
    	this.getAuteursMessagesLus().add(auteur);
    	updateLevelReputationK(message);
    	updateLevelKnowledge(message);
    	shouldAnswer(message);	
    }
    else {
    for (Iterator it = this.getAuteursMessagesLus().iterator(); it.hasNext();) {
    	Member auteurMessageLu = (Member) it.next();
    	if (auteurMessageLu.equals(auteur)) {
    		probaLect = levelRepKauteur - levelRepKmemb;
    		if (probaLect > q) { 
    			this.getMessagesLus().add(message);
    			updateLevelReputationK(message);
    			updateLevelKnowledge(message);
    			shouldAnswer(message);
    		}
    	}
    	else {					
    		this.getAuteursMessagesLus().add(auteur);
    		this.getMessagesLus().add(message);
    		updateLevelReputationK(message);
    		updateLevelKnowledge(message);
    		shouldAnswer(message);
    	}	
    }
    }	
    }
    Je pense que le problème est lié à l'utilisation simultanée de l'itérateur et à la modification de la liste (this.getAuteursMessagesLus().add(auteur), mais je ne vois pas comment le résoudre.

    Merci d'avance pour votre aide.

    Emilie

  2. #2
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Ben pour parcourir et miodifier en même temps la même liste?

    Tu peux aussi essayer sans itérateur, mais le probléme se pose aussi car la taille de ta liste va varier, tu peux avoir un OndexOutOfBounds.

    Alors qu'est ce que tu veux faire? Dans ce cas là il faut peut-être travailler sur une copie de la liste ?

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu peux tout simplement utiliser la méthode listIterator() qui renvoi un ListIterator. Ce dernier étend l'Iterator classique en proposant un parcours bidirectionnelle et l'ajout d'élément dans la liste

    a++

  4. #4
    Membre confirmé Avatar de Emilie MARQUOIS-OGEZ
    Femme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 80
    Par défaut
    J'ai modifié le code en conséquence mais le programme ne s'arrête pas...

    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
     
    private void processNewMessage(Message message) {
    	float probaLect;
    	float q = SimVirtCom.getNextRandomFloat(); 
    	Theme themeMess = message.getTheme();
    	Member auteur = message.getMember();
    	float levelRepKmemb = levelRepK.getLevelForThemeAndMember(themeMess, this);
    	float levelRepKauteur = levelRepK.getLevelForThemeAndMember(themeMess, auteur);	
    if (this.getAuteursMessagesLus().size() == 0) {
    	this.getMessagesLus().add(message);
    	this.getAuteursMessagesLus().add(auteur);
    	updateLevelReputationK(message);
    	updateLevelKnowledge(message);
    	shouldAnswer(message);	
    }
    else {
    int messLus = this.getAuteursMessagesLus().size();
    ListIterator it = this.getAuteursMessagesLus().listIterator(messLus)); {
    	for(;it.hasPrevious();)
    	if (auteurMessageLu.equals(auteur)) {
    		probaLect = levelRepKauteur - levelRepKmemb;
    		if (probaLect > q) { 
    			this.getMessagesLus().add(message);
    			updateLevelReputationK(message);
    			updateLevelKnowledge(message);
    			shouldAnswer(message);
    		}
    	}
    	else {					
    		this.getAuteursMessagesLus().add(auteur);
    		this.getMessagesLus().add(message);
    		updateLevelReputationK(message);
    		updateLevelKnowledge(message);
    		shouldAnswer(message);
    	}	
    }
    }	
    }

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Tu ne te déplaces pas dans l'iterateur tu reste tout le temps à la même position. De plus tu dois utiliser la méthode add() du ListIterator et non pas directemetn sur la liste...


    a++

  6. #6
    Membre confirmé Avatar de Emilie MARQUOIS-OGEZ
    Femme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 80
    Par défaut
    private void processNewMessage(Message message) {
    float probaLect;
    float q = SimVirtCom.getNextRandomFloat();
    Theme themeMess = message.getTheme();
    Member auteur = message.getMember();
    float levelRepKmemb = levelRepK.getLevelForThemeAndMember(themeMess, this);
    float levelRepKauteur = levelRepK.getLevelForThemeAndMember(themeMess, auteur);
    if (this.getAuteursMessagesLus().size() == 0) {
    this.getMessagesLus().add(message);
    this.getAuteursMessagesLus().add(auteur);
    updateLevelReputationK(message);
    updateLevelKnowledge(message);
    shouldAnswer(message);
    }
    else {
    for (ListIterator listIter = this.getAuteursMessagesLus().listIterator(); listIter.hasNext() {
    private void processNewMessage(Message message) {
    float probaLect;
    float q = SimVirtCom.getNextRandomFloat();
    Theme themeMess = message.getTheme();
    Member auteur = message.getMember();
    float levelRepKmemb = levelRepK.getLevelForThemeAndMember(themeMess, this);
    float levelRepKauteur = levelRepK.getLevelForThemeAndMember(themeMess, auteur);
    if (this.getAuteursMessagesLus().size() == 0) {
    this.getMessagesLus().add(message);
    this.getAuteursMessagesLus().add(auteur);
    updateLevelReputationK(message);
    updateLevelKnowledge(message);
    shouldAnswer(message);
    }
    else {
    for (ListIterator listIter = this.getAuteursMessagesLus().listIterator(); listIter.hasNext() {
    Member auteurMessageLu = (Member) listIter.next();
    if (auteurMessageLu.equals(auteur)) {
    probaLect = levelRepKauteur - levelRepKmemb;
    if (probaLect > q) {
    this.getMessagesLus().add(message);
    updateLevelReputationK(message);
    updateLevelKnowledge(message);
    shouldAnswer(message);
    }
    }
    else {
    listIter.add(auteur);
    this.getMessagesLus().add(message);
    updateLevelReputationK(message);
    updateLevelKnowledge(message);
    shouldAnswer(message);
    }
    }
    }
    }

    for(;it.hasPrevious()
    if (auteurMessageLu.equals(auteur)) {
    probaLect = levelRepKauteur - levelRepKmemb;
    if (probaLect > q) {
    this.getMessagesLus().add(message);
    updateLevelReputationK(message);
    updateLevelKnowledge(message);
    shouldAnswer(message);
    }
    }
    else {
    this.getAuteursMessagesLus().add(auteur);
    this.getMessagesLus().add(message);
    updateLevelReputationK(message);
    updateLevelKnowledge(message);
    shouldAnswer(message);
    }
    }
    }
    }

  7. #7
    Membre confirmé Avatar de Emilie MARQUOIS-OGEZ
    Femme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 80
    Par défaut
    J'ai fait qulelques modifs mais idem... Ca continue à tourner...

    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
     
    if (this.getAuteursMessagesLus().size() == 0) {
    	this.getMessagesLus().add(message);
    	this.getAuteursMessagesLus().add(auteur);
    	updateLevelReputationK(message);
    	updateLevelKnowledge(message);
    	shouldAnswer(message);	
    }
    else {
    for (ListIterator listIter = this.getAuteursMessagesLus().listIterator(); listIter.hasNext();) {
    	Member auteurMessageLu = (Member) listIter.next();
    	if (auteurMessageLu.equals(auteur)) {
    		probaLect = levelRepKauteur - levelRepKmemb;
    		if (probaLect > q) { 
    			this.getMessagesLus().add(message);
    			updateLevelReputationK(message);
    			updateLevelKnowledge(message);
    			shouldAnswer(message);
    		}
    	}
    	else {					
    		listIter.add(auteur);
    		this.getMessagesLus().add(message);
    		updateLevelReputationK(message);
    		updateLevelKnowledge(message);
    		shouldAnswer(message);
    	}	
    }
    }	
    }

  8. #8
    Membre confirmé Avatar de Emilie MARQUOIS-OGEZ
    Femme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 80
    Par défaut
    Citation Envoyé par thibaut
    Ben pour parcourir et miodifier en même temps la même liste?

    Tu peux aussi essayer sans itérateur, mais le probléme se pose aussi car la taille de ta liste va varier, tu peux avoir un OndexOutOfBounds.

    Alors qu'est ce que tu veux faire? Dans ce cas là il faut peut-être travailler sur une copie de la liste ?
    Tu peux être plus précis ? Merci.

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

Discussions similaires

  1. [ConcurrentModificationException] Arraylist et Timer
    Par lebesnec dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 05/01/2012, 11h47
  2. Réponses: 3
    Dernier message: 20/04/2007, 17h03
  3. Réponses: 3
    Dernier message: 11/01/2007, 13h56
  4. Réponses: 5
    Dernier message: 07/06/2006, 22h05
  5. [Collection] ConcurrentModificationException
    Par calvin dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 19/05/2004, 09h00

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