Sobes.tech
Junior — Middle

Ko nozīmē Java izraisīta ConcurrentModificationException un kādos gadījumos tā var tikt izsaukta?

sobes.tech AI

Atbilde no AI

ConcurrentModificationException izņēmums Java rodas, kad iterējot pa kolekciju, tās struktūra tiek mainīta (piemēram, pievienojot vai dzēšot elementus), neizmantojot iteratoru, bet tieši kolekcijas metodēm. Šis fail-fast mehānisms brīdina par potenciāli bīstamām izmaiņām, kas var novest pie nepareizas iteratora darbības.

Bieži sastopamās situācijas, kad tiek izsaukts šis izņēmums:

  • Iterējot pa ArrayList ar Iterator, un cikla laikā tieši izsauc list.remove(), nevis iterator.remove().
  • Kolekcijas modifikācija no cita pavediena (thread) iterācijas laikā bez sinhronizācijas.

Piemērs:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String s : list) {
    if (s.equals("b")) {
        list.remove(s); // izmetīs `ConcurrentModificationException`
    }
}

Pareizais veids, kā dzēst elementu iterācijas laikā:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    if (s.equals("b")) {
        iterator.remove(); // droši
    }
}