ConcurrentModificationException para ArrayList [duplicado]
Tengo el siguiente fragmento de código:
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();
}
Cuando intento ejecutarlo, aparece: ¿ ConcurrentModificationException
Alguien puede explicar por qué sucede, incluso si el código se ejecuta en el mismo hilo? ¿Y cómo podría evitarlo?
Aceptado
No puedes eliminarlo de la lista si estás navegando con el bucle "para cada". Puedes usar Iterator
. Reemplazar:
for (DrugStrength aDrugStrength : aDrugStrengthList) {
if (!aDrugStrength.isValidDrugDescription()) {
aDrugStrengthList.remove(aDrugStrength);
}
}
Con:
for (Iterator<DrugStrength> it = aDrugStrengthList.iterator(); it.hasNext(); ) {
DrugStrength aDrugStrength = it.next();
if (!aDrugStrength.isValidDrugDescription()) {
it.remove();
}
}
Como dicen las otras respuestas, no puedes eliminar un elemento de una colección sobre la que estás iterando. Puede solucionar esto usando explícitamente un Iterator
y eliminando el elemento allí.
Iterator<Item> iter = list.iterator();
while(iter.hasNext()) {
Item blah = iter.next();
if(...) {
iter.remove(); // Removes the 'current' item
}
}