Método remove() do HashMap: ConcurrentModificationException?

5 respostas
brlima

Aeeeww!
To tendo essa exception ai qdo tento remover ( remove() ) um objeto de uma HashMap. Detalhe que to com o conteudo desse indice numa variavel, objtida pelo método get().

To querendo remover o objeto ( elemento do map ) caso encontre um determinado. Sei que podia setar pra null o objeto no indice, mas qria saber pq ta acontecendo isso… Alguem sabe ?? Tentei ver se tem algo em algum livro aki, mas nada. Se alguem souber e puder dar um alo, agradeço…

Segue o exemplo do codigo abaixo se alguem quiser testar:

static class Carro{
        String nome = "";
        double qtde = 0;
        Carro(String pnome, double pqtde){
            nome = pnome;
            qtde = pqtde;
        }
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        java.util.HashMap mapa = new java.util.HashMap();
        
        mapa.put(new Integer(1), new Carro("Audi A3", 1.5));
        mapa.put(new Integer(2), new Carro("Astra", 2.5));
        mapa.put(new Integer(3), new Carro("BMW", 3.2));
        mapa.put(new Integer(4), new Carro("Peugeot 206", 4.1));
        mapa.put(new Integer(5), new Carro("Golf", 8.0));
        
        Set set = mapa.keySet();
        Iterator i = set.iterator();
        while(i.hasNext()){
            
            Integer index = (Integer)i.next();
            Carro meuCarro = (Carro)mapa.get(index);
            
            if(meuCarro.nome.equals("BMW")){
                mapa.remove(index);
            }else{
                meuCarro.nome = meuCarro.nome + " do Bruno";
            }
            
        }
        
        
        set = mapa.keySet();
        i = set.iterator();
        while(i.hasNext()){
            Carro meuCarro = (Carro)mapa.get((Integer)i.next());
            System.out.println(meuCarro.nome);
        }
        
        System.exit(0);
        
    }

5 Respostas

_fs

Se a estrutura de um Map é modificada depois que um Iterator é criado a partir dele, exeto utilizando o proprio Iterator, essa exceção é lançada.

Trecho traduzido e adaptado por Lipe

Aqui o link :smiley:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html

Heber

quando vc faz

Set set = mapa.keySet(); Iterator i = set.iterator();

o Iterator gerado estará apontando para os registros do HashMap, então quando vc tenta exclui algum objeto do HashMap ele viola a visão do Iterator, então ele lança essa exceção por haver concorrência no acesso e modificação dos dados.

Entendeu ???

brlima

show :smiley: !!!
Valeu Lipe e Heber…
Agora eu intindi… hehehheehhe

tks!

cv1

Resolvendo de vez: iterator.remove() :wink:

brlima

é isso ae CV… tinha esquecido do detalhe de trabalhar com o iterator… :roll:

Criado 19 de abril de 2004
Ultima resposta 19 de abr. de 2004
Respostas 5
Participantes 4