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
ArrayListarIterator, un cikla laikā tieši izsauclist.remove(), nevisiterator.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
}
}