TransWikia.com

ConcurrentModificationException como proceder?

Stack Overflow em Português Asked by Roknauta on February 28, 2021

Tenho o seguinte método:

private void houveAlteracao(Long id) {
        try {
            Objeto objeto = service.find(id);
            objeto.setEventos(JsfUtils.ordenarListaEventosPorHora(objeto.getEventos()));
            Objeto obj = popularObjeto(objeto.getCodigo());
            obj.setEventos(JsfUtils.ordenarListaEventosPorHora(obj.getEventos()));
            if (obj.getEventos().size() > objeto.getEventos().size()) {
                for (Evento ev : obj.getEventos()) {
                    for (Evento e : objeto.getEventos()) {
                        if (!ev.getHorario().equals(e.getHorario())) {
                            objeto.getEventos().add(ev);
                            ev.setObjeto(objeto);
                            if (ev.getDestino() != null) {
                                ev.getDestino().setEvento(ev);
                            }
                        }
                    }
                }
                service.update(objeto);
                pesquisar();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Está ocorrendo o erro:

13:18:23,335 ERROR [stderr] (default task-2)
java.util.ConcurrentModificationException

13:18:23,336 ERROR [stderr] (default task-2) at
java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)

13:18:23,337 ERROR [stderr] (default task-2) at
java.util.ArrayList$Itr.next(ArrayList.java:851)

Eu li que o erro ocorre por conta de se alterar uma lista em iteração, alguém sabe como posso fazer pra resolver ?

2 Answers

Agradeço aos comentários mas me baseando em alguns mesmo eu pensei nessa lógica, aceito críticas se cometi algum erro mas agora está funcionando uma vez que eu ordeno as listas para que os valores batam certinho. Fiz nessa estrutura uma vez que ambas as listas possuem valores iguais aí eu só complemento a 2 com os faltantes:

private void houveAlteracao(Long id) {
        try {
            Objeto objeto = service.find(id);
            objeto.setEventos(JsfUtils.ordenarListaEventosPorHora(objeto.getEventos()));
            Objeto obj = popularObjeto(objeto.getCodigo());
            obj.setEventos(JsfUtils.ordenarListaEventosPorHora(obj.getEventos()));
            if (obj.getEventos().size() > objeto.getEventos().size()) {
                int contador = obj.getEventos().size() - objeto.getEventos().size();
                int inicioIndice = obj.getEventos().size() - contador;
                for (int i = inicioIndice; i < obj.getEventos().size(); i++) {
                    Evento evento = obj.getEventos().get(i);
                    evento.setObjeto(objeto);
                    if (evento.getDestino() != null) {
                        evento.getDestino().setEvento(evento);
                    }
                    objeto.getEventos().add(evento);
                }
                service.update(objeto);
                pesquisar();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Answered by Roknauta on February 28, 2021

Você pode usar a interface Iterator<T> para iterar a lista que deseja modificar.

Ao invés de fazer for (Evento e : objeto.getEventos()) { }, faça:

Iterator<Evento> iterator = objeto.getEventos().iterator();
while(iterator.hasNext()) {
    Evento e = iterator.next(); //se quiser usar a iteração atual
    iterator.add(ev);
}

Isso adiciona o objeto ev ao iterator durante a iteração.


Se quiser que o item seja adicionado de fato na lista (para usar depois de que sair dos laços de repetição, por exemplo), acho que você precisa adicionar esses itens em uma "lista temporária" durante as iterações e depois fazer um addAll() na lista original. Não tenho certeza se o Iterator faz o bind de volta para a lista quando é modificado.

Answered by igventurelli on February 28, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP