{}const=>[]async()letfn</>var
Développement

😵 Pourquoi ConcurrentModificationException est si souvent pris par les juns

Nous analysons avec des exemples pourquoi la liste ne peut pas être modifiée dans une boucle et comment ne pas tomber sur ce bug

К

Kodik

Auteur

2 min de lecture

Lorsque vous commencez à écrire en Java, l'une des premières erreurs rencontrées par les débutants est une bête effrayante avec un nom long : ConcurrentModificationException. Cette erreur semble effrayante, mais sa raison est banale. Voyons pourquoi cela se produit et comment l'éviter.

Que se passe-t-il ?

List<String> names = new ArrayList<>();
names.add("Anya");
names.add("Boris");
names.add("Vika");

for (String name : names) {
    if (name.equals("Vika")) {
        names.remove(name); // 💥 ConcurrentModificationException!
    }
}

Mais au lieu d'un résultat, vous obtenez une exception.

🔥 100 000+ étudiants déjà avec nous

Marre de lire la théorie ?
Il est temps de coder !

Kodik — une appli où tu apprends à coder par la pratique. Mentor IA, leçons interactives, projets réels.

🤖 IA 24/7
🎓 Certificats
💰 Gratuit
🚀 Commencer
Ont rejoint aujourd'hui

🤛 Pourquoi cela se produit-il ?

Parce que for-each utilise itérateur à l'intérieur, et vous changez la liste elle-même en même temps. C'est comme si vous traversiez un pont et que quelqu'un démontait les planches derrière vous. La JVM est comme : « STOP ! Ce n'est pas sûr ! » 🚨

🔍 Comment comprendre ce qui cause l'erreur

  • list.remove() à l'intérieur de for-each

  • map.put() à l'intérieur de for par map.entrySet()

  • Modification via la collection à l'intérieur de Stream

✅ Comment bien faire

🛠 Méthode 1 : Utilisez un for ordinaire

for (int i = 0; i < names.size(); i++) {
    if (names.get(i).equals("Vika")) {
        names.remove(i);
        i--;
    }
}

🛠 Méthode 2 : Utiliser Iterator

Iterator<String> it = names.iterator();
while (it.hasNext()) {
    if (it.next().equals("Vika")) {
        it.remove();
    }
}

🛠 Méthode 3 : Utilise removeIf

names.removeIf(name -> name.equals("Vika"));

🤯 Pourquoi les juns se trompent souvent

  • ❌ Ils ne savent pas que for-each utilise Iterator à l'intérieur

  • ❌ Confondre remove() dans la collection et dans l'itérateur

  • ❌ Ils ont peur d'utiliser Iterator car il semble « ancien »

  • ❌ Ne lisent pas attentivement la trace

💬 Comment cela sonne lors d'un entretien

— Pourquoi as-tu dans ton code ConcurrentModificationException ?
— J'ai juste supprimé l'élément à l'intérieur de for-each...

ConcurrentModificationException n'est pas un bug, c'est une protection contre les comportements potentiellement dangereux. Et si vous l'avez attrapé, réjouissez-vous ! Vous êtes maintenant un peu plus près de comprendre Java à un niveau profond 🧩

📚 Vous voulez approfondir le sujet ?

Dans l'application Code vous trouverez des leçons détaillées sur CMake et C++, des exercices étape par étape, des analyses d'erreurs et des exercices pratiques directement sur votre téléphone ou votre navigateur.

Et si vous voulez être au courant des nouveautés, des nouvelles fonctionnalités et des contenus utiles, abonnez-vous à notre Chaîne Telegram. C'est confortable, professionnel et avec amour pour le code ❤️

🎯Arrête de reporter

Tu as aimé l'article ?
Place à la pratique !

Avec Kodik, tu ne lis pas seulement — tu codes immédiatement. Théorie + pratique = vraies compétences.

Pratique instantanée
🧠L'IA explique le code
🏆Certificat

Sans inscription • Sans carte