Repaso
English
Java CoreIntermedioJV-24

¿Por qué este código lanza ConcurrentModificationException?

List<Integer> nums = new ArrayList<>(List.of(1, 2, 3, 4));
for (Integer n : nums) {
    if (n % 2 == 0) nums.remove(n);
}

Opciones

  1. remove no está permitido en listas creadas con new ArrayList
  2. La lista se modificó mientras el iterator del for-each la recorría (Opción correcta)
  3. Los objetos Integer no se pueden quitar de una lista
  4. Otro thread está cambiando la lista al mismo tiempo

Respuesta

Porque la lista se modificó estructuralmente mientras el iterator del for-each la recorría

Por qué

El bucle for-each usa un iterator por debajo. El iterator recuerda cuántas modificaciones tenía la lista al empezar. Si añades o quitas elementos a través de la propia lista durante el bucle, el iterator detecta el cambio y falla de inmediato con esta excepción. Ocurre incluso con un solo thread.

Opciones seguras: nums.removeIf(n -> n % 2 == 0), usar iterator.remove() o construir una lista nueva con un stream.

nums.removeIf(n -> n % 2 == 0);

Recuerda

No modifiques una colección mientras la recorres; usa removeIf o Iterator.remove.

Términos clave

Practica esta pregunta en Repaso