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.ConcurrentModificationException13: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 ?
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP