Java · Intermediário · Inglês · Técnico
ConcurrentModificationException
Exceção lançada quando uma coleção é alterada durante uma iteração que não esperava a mudança, como remover dentro de um for-each. Os iteradores são fail-fast.
Onde usar
Aparece ao remover itens dentro de um for-each; a correção é usar iterator.remove() ou removeIf.
Em código
var l = new ArrayList<>(List.of(1, 2, 3));
for (var n : l) {
if (n == 1) l.remove(n); // lança CME
}
l.removeIf(n -> n == 1); // forma corretaExemplos
Removing inside the for-each throws a ConcurrentModificationException.
Remover dentro do for-each lança uma ConcurrentModificationException.
Use removeIf instead of removing in a loop.
Use removeIf em vez de remover dentro de um laço.
Cuidado
A exceção é só um auxílio para achar bugs, não garantia contra race conditions; coleções concorrentes se comportam de outro jeito.
Sinônimos
CME