Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'Iterator...

./suicide

    25 janvier 2012 à 19:21:48

    Hello !

    Bon, je débute en Java et un peu d'aide pour trouver mon erreur serait sympa, ça fait bien deux heures que je cherche. ;)

    J'ai donc une classe Ant qui implémente un certain nombre de méthode dont la méthode isDead() :

    public class Ant {
    	
    	private int identifier;
    	private int curAge;
    	private int maximumAge;
    	static int compteurAnt = 0;
    	
    	Ant(int maxAge, int age){
    		compteurAnt++;
    		identifier = compteurAnt;
    		maximumAge = maxAge;
    		curAge = age;
    	}
    
    	
            ...
            ...
    	
    
    	public boolean isDead() {
    		if (getCurAge() == getMaxAge())
    			return true;
    		else return false;
    	}
    }
    



    Cette méthode isDead(), je l'appelle dans une autre classe, à savoir la classe Anthill :

    public class Anthill {
    	
            ...
    
    	private static int nbDeath;
    	protected static ArrayList<Ant> anthill = new ArrayList<Ant>();
    	private static Iterator<Ant> i = anthill.iterator();
    
            ...
            ...
    
    	public static int getNbDeath() {
    	
    		nbDeath = 0;
    		
    		while(i.hasNext()) {
    			Ant ant = i.next();
    			if (ant.isDead())
    				nbDeath++;
    		}
    		
    		return nbDeath;
    	}
    }
    



    Et mon problème vient de cet iterator. Aucun problème de compilation avec Eclipse mais lors de l'exécution, je lève l'exception java.util.ConcurrentModificationException. Après quelques recherches, j'ai cru comprendre que cette exception survient lorsqu'on veut modifier un élément d'une liste en utilisant un iterator. Or, ce n'est pas mon cas (En tout cas, je ne le souhaite pas).

    Des idées d'où ça vient ? :)
    • Partager sur Facebook
    • Partager sur Twitter
      26 janvier 2012 à 11:54:40

      Salut, cela aurait été bien que tu mette le bout de code où tu modifie la list en plus. Et une stackTrace plus complète aussi serait plus facile pour t'aide. Ce qui est sur c'est que tu li la liste en même temps que tu la modifie.
      • Partager sur Facebook
      • Partager sur Twitter
        26 janvier 2012 à 21:35:49

        Tu n'utilises pas les itérateurs correctement.

        Les itérateurs sont des objets par essence très ephémères. ON ne garde en principe pas leur référence très longtemps.

        Là, je vois que tu as une variable d'instance de type itérateur. C'est faux, ça ne peut pas marcher.

        Un itérateur devient invalide dès que la structure à laquelle il fait référence a été modifiée après sa création. Là comme tu le gardes en mémoire, ça arrive très rapidement.

        NE garde pas ton itérateur en tant que variable d'instance mais redemandes-en un nouveau à chaque appel de ta méthode et ça marchera.
        • Partager sur Facebook
        • Partager sur Twitter

        Problème d'Iterator...

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown