Mam następujący fragment kodu:ConcurrentModificationException dla ArrayList
private String toString(List<DrugStrength> aDrugStrengthList) {
StringBuilder str = new StringBuilder();
for (DrugStrength aDrugStrength : aDrugStrengthList) {
if (!aDrugStrength.isValidDrugDescription()) {
aDrugStrengthList.remove(aDrugStrength);
}
}
str.append(aDrugStrengthList);
if (str.indexOf("]") != -1) {
str.insert(str.lastIndexOf("]"), "\n ");
}
return str.toString();
}
Kiedy próbuję go uruchomić, dostaję ConcurrentModificationException
, może ktoś wyjaśnić, dlaczego tak się dzieje, nawet jeśli kod jest uruchomiony w tym samym wątku? I jak mogłem tego uniknąć?
[Powinieneś przestać się martwić i pokochałem powtórzeń.] (Http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how- Nauczyłem się przestać - martwić się i kochać - duplikować /). – Will
Wyjaśnienie tego wyjątku jest takie, że iterator tablicy ArrayList jest iteratorem fail-fast; tj. nie powiedzie się (wyrzuci wyjątku), gdy wykryje, że jego gromadzenie w międzyczasie zostało zmodyfikowane. W porównaniu z iteratorami fail-safe, które nie powodują jednoczesnych modyfikacji wyjątków (np. W kolekcjach ConcurrentHashMap i CopyOnWriteArrayList). –