Jump to content
tcms

java.util.ConcurrentModificationException

Recommended Posts

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

Edited by brunoais
geshi

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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));

Share this post


Link to post
Share on other sites
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();
  }
}

Share this post


Link to post
Share on other sites
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

Edited by eatg75
  • Vote 1

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.

Share this post


Link to post
Share on other sites
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

Edited by tcms

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.