Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

tcms

java.util.ConcurrentModificationException

Mensagens Recomendadas

tcms    1
tcms

Boas malta,

Tenho um Map imagens associadas a objectos, neste caso Map<Image, Object>.

E o que quero fazer é, quando acontecer determinada condição a cada Object, ele retira a imagem correspondente da Frame.

E fiz isso assim:

public void removerInvasor() {
 for (Images image: Map_Inv.keySet()) {
  for (Objects object : Map_Inv.values()) {
   if (objects.getLife() == 0) {
    Map_Inv.remove(invaders);

Ao correr o código, mal um dos objects confirma a condição, o erro é lançado. É possivel contornar isto continuando a usar o Map?

Obrigado

Editado por brunoais
geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nelsonr    333
nelsonr

Não te deve deixar mexer no Map_Inv porque está a ser usado no for.

Experimenta criares uma lista vazia no inicio para guardares os "invaders" a remover.

Em vez do Map_Inv.remove, adicionas esse invader à nova lista.

No final de tudo, caso a lista de invaders a remover tenha alguma coisa, chamas o Map_Inv.remove para cada um

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tcms    1
tcms

Não te deve deixar mexer no Map_Inv porque está a ser usado no for.

Experimenta criares uma lista vazia no inicio para guardares os "invaders" a remover.

Em vez do Map_Inv.remove, adicionas esse invader à nova lista.

No final de tudo, caso a lista de invaders a remover tenha alguma coisa, chamas o Map_Inv.remove para cada um

Obrigado nelson, fiz isso, ficou assim:

public void removerInvasor() {

 List<Invaders> aux = new ArrayList<Invaders>();
 List<MovingImage> aux2 = new ArrayList<MovingImage>();
 for (Images image : Map_Inv.keySet()) {
  for (Objects object : Map_Inv.values()) {
   if (object.getLife() == 0) {
 aux.add(object);
 aux2.add(image);
 index.getDisplayer().remove(aux2.get(aux2.size()-1));
   }
  }
 }
 Map_Inv.remove(aux.addAll(aux));

O problema é que basta um atingir a condição e são ambos eliminados da Frame, portanto o problema deverá estar aqui :remove(aux2.get(aux2.size()-1));

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tcms    1
tcms

Acabei de testar este, mas o problema agora é que me lança o nosso querido NullPointerExc

public void LIVE_teste5(){
 Iterator<Image> it = Map_Inv.keySet().iterator();
 while (it.hasNext()){
   it.next();
   if (Map_Inv.get(it).ja_morreu())
  it.remove();
  }
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
eatg75    21
eatg75

Porque que estas a utilizar um HashSet se uma lista e resolve o teu problema?

Na operacao removerInvasor() estar a utilizar uma ArrayList, atencao que uma array list so e eficaz quando tens uma colecao fixa que prentedents a todo instante aceder a um elemento, ao passo que uma LinkedList e exatamente o oposto da ArrayList permite a insercao e eliminacao de elementos de forma optimizado, mas, aceder ou procurar um elemento e um bocado custuoso. Ajudaria um bocado se disses que excepcoes estao a ser lancadas, ah ja agora estas a remover os elementos de forma assincrona?

public void LIVE_teste5() {
 Iterator<Image> it = Map_Inv.keySet().iterator();

 while (it.hasNext()){
it.next(); // errado !! deve ser feita no fim, independentemente do tamanho da HashMap nunca acederas ao primeiro elemento com  este
			  // codigo, estas a ter uma especie de [i]off by one[/i]
if (Map_Inv.get(it).ja_morreu()) // excepcao esta a ser lancada aqui
  it.remove();
 }
}

A versao correta seria algo como :

public void LIVE_teste5(){
 Iterator<Image> it = Map_Inv.keySet().iterator();

 while (it.hasNext()) {
   if (Map_Inv.get(it).ja_morreu())
  it.remove();
   it.next();
  }
}

EDIT x3 : Alterei a identacao

EDIT 2 : Tinha a instrucao it.next(); fora do ciclo while

Editado por eatg75

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tcms    1
tcms

Ele nesse caso continua a dar-me erro mas penso que o problema está no

Map_Inv.get(it).ja_morreu()

isto porque eu quero eliminar do Map a Imagem correspondente, e ao fazer get(it) ele não vai dar o index correcto, e daí o nullPointer

Em relação ao que disseste, estou a usar um Map, porque cada Imagem tem um objecto associado, e esse objecto tem atributos, como por exemplo a sua vida . E aqui pretendo que ao acontecer determinado condição a esse objecto, a respectiva Image também acontece algo. Dai ter usado o HashMap

Editado por tcms

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.