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 :

Erreur lors de l'execution d'une boucle


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Points : 20
    Points
    20
    Par défaut Erreur lors de l'execution d'une boucle
    Bonjour

    Voici le code que je teste :

    Code java : 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
     
    public void ajoutPiece(Piece pi, String repere){
    		if(lesPieces.size()!=0){
    			for(Piece p : lesPieces){
    				if(repere.equals(p.getRepere())){
    					System.out.println("Il y a deja une piece avec ce repere");
    				}else{
    					this.lesPieces.add(pi);	
    					System.out.println("piece ajoutée");
    				}
    			}
    		}else{
    			this.lesPieces.add(pi);	
    			System.out.println("piece ajoutée");
    		}
    	}

    Mon soucis est que quand j'ai pas de pieces, donc ma 1ere condition non verifiée, ma piece s'ajoute. Mais dès qu'il faut rentrer dans mon for, il me marque bien piece ajoutée, mais derriere j'ai des erreurs :


    Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
    at java.util.LinkedList$ListItr.next(Unknown Source)
    at Boite.ajoutPiece(Boite.java:12)
    at Main.main(Main.java:68)



    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Points : 1 212
    Points
    1 212
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "main" java.util.ConcurrentModificationException
    Cette erreur signifie que tu essaies de modifier un objet (le plus souvent une liste ou tableau) à deux endroits "à la fois".

    En effet, dans ton cas, tu fais ceci for(Piece p : lesPieces), ce qui signifie que tu veux parcourir tous les éléments de ta liste. Et dans cette boucle, tu fais this.lesPieces.add(pi);, ce qui signifie que tu ajoutes un éléments à ta liste. Mais du coup, comment doit se comporter ta boucle initiale ? Doit-elle prendre en compte l'ajout ? Si oui, que faire si l'élément aurait déjà du être parcouru (ajout en début de liste par exemple) ? Etc. C'est pour tous ces problèmes que l'exception est levée.

    Pour résoudre ceci, une façon de faire est de commencer par copier ta liste, puis de parcourir la copie, et, lorsque nécessaire, de modifier la liste initiale.

    Mako.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    À mon humble avis, de toute façon ce code était mal pensé.
    Là, il ajoute la pièce plusieurs fois : autant de fois qu'il peut trouver une pièce qui n'a pas le même repère.
    J'imagine que le but était de n'ajouter la pièce qu'une seule fois, et seulement s'il n'y a aucune pièce ayant ce repère.

    Dans ce cas-là, lesPieces ne devrait pas être une Collection. Ça devrait être une Map, dont les clés sont les repères, et les valeurs sont les pièces qui ont le repère correspondant.
    Il suffit alors d'utiliser containsKey() pour voir si le repère est déjà dans la Map ou non.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Points : 20
    Points
    20
    Par défaut
    Merci pour vos reponses, j'ai testé avec une copie de liste mais j'avais un soucis, et apres j'ai repensé que j'avait une fonction qui chercher une piece dans la liste en fonction du repere donc
    Code java : 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
    public void ajoutPiece(Piece pi, String repere){
    		if(lesPieces.size()!=0){
    			Piece laPiece = this.chercherPiece(repere);
    			if(laPiece==null ){
    				this.lesPieces.add(pi);	
    				System.out.println("piece ajoutée");
    			}
    			else{
    				System.out.println("Il y a deja une piece avec ce repere");
     
    			}
    		}else{
    			this.lesPieces.add(pi);	
    			System.out.println("piece ajoutée");
    		}
    	}

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 68
    Points : 116
    Points
    116
    Par défaut
    Bonjour
    si tu voulais utiliser l'algo précédent sans faire de copie de liste, il fallait utiliser un ListIterator pour parcourir ta linkedList et ajouter les éléments voulus

Discussions similaires

  1. Erreur lors de l'execution d'une fonction
    Par SpeedOverflow dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 24/09/2011, 16h56
  2. erreur lors de l'execution d'une appli ( Hibernate -spring-trapesty)
    Par hergos dans le forum Persistance des données
    Réponses: 0
    Dernier message: 23/11/2010, 16h13
  3. Crach lors de l'execution d'une boucle (a sa place)
    Par NatanielKrios dans le forum Débuter
    Réponses: 18
    Dernier message: 12/07/2010, 22h06
  4. Réponses: 6
    Dernier message: 13/12/2007, 03h13
  5. [VS]Erreur lors de l'execution d'une fonction
    Par nephhh dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2007, 14h12

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