Junior — Middle
Čo znamená vznik výnimky ConcurrentModificationException v Jave a v akých situáciách môže byť vyhodená?
sobes.tech AI
Odpoveď od AI
Výnimka ConcurrentModificationException v Jave nastáva, keď počas iterácie cez kolekciu dôjde k jej štrukturálnej zmene (napríklad pridanie alebo odstránenie prvkov), nie prostredníctvom iterátora, ale priamo pomocou metód kolekcie. Tento mechanizmus fail-fast upozorňuje na potenciálne nebezpečné zmeny, ktoré môžu viesť k nesprávnemu správaniu iterátora.
Typické situácie, kedy sa táto výnimka vyvolá:
- Iterácia cez
ArrayListpomocouIterator, a v cykle sa volálist.remove()priamo, namiestoiterator.remove(). - Modifikácia kolekcie z iného vlákna počas iterácie bez synchronizácie.
Príklad:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String s : list) {
if (s.equals("b")) {
list.remove(s); // vyvolá `ConcurrentModificationException`
}
}
Správny spôsob odstraňovania počas iterácie:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.equals("b")) {
iterator.remove(); // bezpečné
}
}