Acrescentar objeto em uma collection - java.util.ConcurrentModificationException

4 respostas
Marques

Lista ,

Percorro uma collection e dependendo de uma condição preciso adicionar um objeto à mesma. Porém ao tentar fazê-lo recebo um java.util.ConcurrentModificationException.

Como resolver essa parada?
Muito obrigado,

Marques

for (Iterator it = totalAssociados.iterator(); it.hasNext();) {				
	AssociadoDTO regAssociado = (AssociadoDTO) it.next();

	if (condição) {
		// recupero objeto  e pereciso adcicionar à Collection totalAssociados
		// porém recebo o erro java.util.ConcurrentModificationException
		totalAssociados.add(objeto)

	}
}

4 Respostas

vivi_grieco

como vc ta dentro de uma iteração dessa collection, vc não pode acrescentar nem retirar elementos dela, q vai dar erro. Tente criar uma nova collection e adicionar nela os elementos da collection q vc quer + os novos elementos q vao ser adicionados na condição

K

Ola, estava tendo esse mesmo problema mas ter de criar outra collection para algo simples assim não achei interessante.
Coloque um break apos a alteração para que o loop do interator se interrompa no meu não aparece mais erro. Veja:

int id = Integer.parseInt(entrada.readLine());

for (Iterator  i = cProfissional.iterator(); i.hasNext() ; ){

Profissional excprof = (Profissional) i.next();

if(id == exprof.getMatricula()){

cProfissional.remove(exprof);

break;

}

}

No meu caso estava dando erro porque eu queria excluir um profissional da collection, toda e qualquer alteração feita no loop dava erro,
com o break logo que encontrar o profissional a ser excluido ele o remove e para e entao sai do interator assim não da erro, pra mim funcionou tente
usar a ideia, espero ter ajudado abraços!

Lavieri

ConcurrentLinkedQueue<String> collection = new ConcurrentLinkedQueue<String>();
ConcurrentSkipListSet<String> set = new ConcurrentSkipListSet<String>();

por ordem de inserção use a 1° ela é uma collection e aceita itens repetidas...

a segunda não aceita repetição, porem não tem ordem perfeitamente definida...

as duas aceitam modificações concorrentes....

de uma olhada na API java.util.concurrent ... um exemplo que funciona...

public static void main(String[] args) {
        ConcurrentLinkedQueue<String> collection = new ConcurrentLinkedQueue<String>();
        collection.add("haha");
        collection.add("putz");
        collection.add("concorrente");
        collection.add("nada");
        collection.add("haha");

        for(Iterator<String> itr = collection.iterator(); itr.hasNext();) {
            if (itr.next().equals("concorrente"))
                collection.add("eureca! deu certo");
        }
        for (String s : collection)
            System.out.println(s);
    }

resultado....

haha
putz
concorrente
nada
haha
eureca! deu certo

esse esquema pode ajudar.... http://sergiotaborda.files.wordpress.com/2007/12/collections.png
e esse texto tb ... http://sergiotaborda.wordpress.com/java/colecoes-em-java/

Ps.: agora que eu vi... desenterrou um post de 2006 =x

K

[color=red] Rsrsrss nem percebia a data do post mas esses problemas ainda hoje acontecem… estou estudando java vou visitar muito o forum ^^[/color]

Criado 18 de outubro de 2006
Ultima resposta 22 de mar. de 2009
Respostas 4
Participantes 4