Acces concurrents à un ArrayList

Fermé
Nelinroft - 31 janv. 2015 à 11:22
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 31 janv. 2015 à 12:16
Bonjour à tous,

je viens soliciter votre aide pour un problème d'acces concurrent à un ArrayList.
Pour recontextualiser un peu, je suis en train de développer un plugin pour un serveur minecraft à fin de gérer des groupes, et ce de façon à progresser en programmation java. Du coup j'ai une classe "Group" et dans une autre classe un ArrayList de groupes. Je suis parvenu à coder une commande pour créer un groupe et une autre pour lister les groupes qui fonctionnent sans problème. Néanmoins, au moment de tester la commande pour supprimer un groupe, j'ai une exception qui apparaît :
"Caused by: java.util.ConcurrentModificationException"
(vous épargnant le reste de l'erreur)

Corrigez moi si je me trompe mais si je comprends bien, ça signigie que dans ma méthode, j'accède à l'ArrayList plusieurs fois au même moment et c'est mal visiblement puisque ça provoque une exception.
Et là où je bloque, c'est au niveau de la résolution. Je ne parviens pas à identifier cette acces concurrent dans le bout de code suivant :


public static void removeGroup (String aim) throws GroupNotFoundException, EmptyListOfGroupException {

		if (groups.isEmpty()) {
			throw new EmptyListOfGroupException();
		}
		else if (!nameExist(aim)) {
			throw new GroupNotFoundException();
		}
		else {
			for (Group i : groups) {
			 	if ( i.getName().equals(aim) ) {
					groups.remove(groups.indexOf(i));
				}
			}
		}
	}


Si quelqu'un pouvez m'expliquer la source de cette erreur et la manière de la résoudre, j'en serais fort heureux.
Merci d'avance pour vos réponses.

PS : pour ce qui serait tenter de me dire "mais il existe déjà un plugin pour gérer les groupes sur un serveur minecraft !", je répondrai : (c.f. moi) "et ce de façon à progresser en programmation java. ".

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
31 janv. 2015 à 12:16
Bonjour,

Le problème est ici :

for (Group i : groups) {
    if ( i.getName().equals(aim) ) {
        groups.remove(groups.indexOf(i));

Tu ne peux pas ajouter ou supprimer un élément de la liste pendant que tu es en train de la parcourir, sinon on ne sait plus où en est dans l'ordre de parcours.

Tu peux t'en sortir comme ceci :

List<Group> toRemove = new ArrayList<Group>();

for (Group i : groups)
    if (i.getName().equals(aim))
        toRemove.add(i);

groups.removeAll(toRemove);
0