1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Removendo itens de um ArrayList - ConcurrentModificationException

Alguém sabe me explicar porque eu consigo remover um item da lista através de um foreach quando este item eh o penúltimo item, mas nao consigo remover quando este item esta no meio da lista.

No exemplo abaixo o primeiro for remove o item sem problemas, mas no segundo for ocorre uma exceçao.

import java.util.ArrayList;
import java.util.List;

public class ArrayListRemove {

    public static void main(String[] args) {

        List<String> list = new ArrayList<String>();

        list.add("um");
        list.add("dois");
        list.add("tres");
        list.add("quatro");
        list.add("cinco");
        list.add("seis");
        list.add("sete");
        list.add("oito");
        list.add("nove");
        list.add("dez");

        System.out.println(list.toString());

        // remove nove - ok
        for (String word : list) {
            if (word.equals("nove")) {
                list.remove(word);
                System.out.println(word + " removed");
            }
        }

        System.out.println(list.toString());

        // remove tres - exception
        for (String word : list) {
            if (word.equals("tres")) {
                list.remove(word);
                System.out.println(word + " removed");
            }
        }

        System.out.println(list.toString());

    }
}
  • Como você vai apenas remover e não utilizar o que removeu da sua lista, você pode percorrer sua lista utilizando um Iterador do java, e remover com o remove() do Iterator.

    Se não estou enganado essa Exception e lançada como medida de segurança, porque o iterator tem um variável contadora, ai quando remove através de um foreach utilizando o remove da interface List, o iterator fica meio "perdidão". Caso precisa-se remover o elemento da lista para fazer alguma manipulação com ele teria que criar um cópia da lista.

    Tenta remover com remove() do iterator que deve resolver seu problema.

    Douglas Arantes   20 de out de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java exception certificação arraylist ou faça a sua própria pergunta.