Sobes.tech
Junior — Middle

O que significa o aparecimento de uma exceção ConcurrentModificationException em Java, e em que situações ela pode ser lançada?

sobes.tech IA

Resposta da IA

A exceção ConcurrentModificationException em Java ocorre quando, durante a iteração sobre uma coleção, ocorre uma alteração estrutural na coleção (por exemplo, adicionar ou remover elementos) que não é feita através do iterador, mas diretamente pelos métodos da coleção. Este mecanismo fail-fast alerta para alterações potencialmente perigosas que podem levar a um comportamento incorreto do iterador.

Situações típicas em que essa exceção é lançada:

  • Iterar sobre um ArrayList usando Iterator, e dentro do ciclo chamar list.remove() diretamente, em vez de iterator.remove().
  • Modificar a coleção a partir de outro thread durante a iteração sem sincronização.

Exemplo:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String s : list) {
    if (s.equals("b")) {
        list.remove(s); // lançará ConcurrentModificationException
    }
}

Forma correta de remover durante a iteração:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    if (s.equals("b")) {
        iterator.remove(); // seguro
    }
}