Recent Posts
Archives

Archive for the ‘The geek way of life’ Category

PostHeaderIcon java.util.ConcurrentModificationException

Probleme rencontre ce matin en Java 5 (Tiger):

[java]
Vector toto = new Vector();
// ...remplissage du vecteur...
for (Object o : toto){
toto.remove(o);
}

Cela leve une exception de type:
java.util.ConcurrentModificationException

Au debut j’ai pense a un probleme de synchronisation, et donc j’ai ajoute un bloc synchronized(mutex){...}, mais cela n’a pas fonctionne.
Mais en fait le probleme est different: apparemment cela vient de la facon dont le “foreach” a la Java gere le parcours des elements d’un vecteur (ou de tout autre objet iterable).

La solution que j’ai trouvee consiste a utiliser un “for” classique, qui fonctionne:

[java]
for (int i=0; i<toto.size(); i++){
Object o = toto.elementAt(i);
remove(o);
}

(je n’ai meme pas tente un remove(i), pour eviter les effets de bord sur les indices)
Neanmoins ce n’est pas ce qu’il y a de mieux, il aurait fallu utiliser un vrai Iterator, mais pour etre franc j’avais legerement la flemme…