ConcurrentModificationException para ArrayList [duplicado]

Resuelto mabuzer asked hace 14 años • 6 respuestas

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: ¿ ConcurrentModificationExceptionAlguien puede explicar por qué sucede, incluso si el código se ejecuta en el mismo hilo? ¿Y cómo podría evitarlo?

mabuzer avatar Jul 06 '10 16:07 mabuzer
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();
    }
}
Konrad Garus avatar Jul 06 '2010 09:07 Konrad Garus

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 Iteratory eliminando el elemento allí.

Iterator<Item> iter = list.iterator();
while(iter.hasNext()) {
  Item blah = iter.next();
  if(...) {
    iter.remove(); // Removes the 'current' item
  }
}
Edward Dale avatar Jul 06 '2010 09:07 Edward Dale