ola, estou desenvolvendo um game como projeto da faculdade, mas sou iniciante em java.
o jogo está quase pronto, mas às vezes, quando testo, recebo uma java.util.ConcurrentModificationException
li um pouco a respeito, mas não percebi como concertar esta situação.
A Exceção ocorre no seguinte trecho:
public void tryToFire() {
for (Iterator<ChickenEntity> iterator = chickens.iterator(); iterator.hasNext(); ) {
ChickenEntity c = iterator.next();
if (System.currentTimeMillis() - c.getlastFire() >= c.getfiringInterval()) {
c.setlastFire(System.currentTimeMillis());
EggEntity shot = new EggEntity(this,"sprites/egg.gif",c.getX()+10,c.getY()+80);
eggs.add(shot);
}
}
}
O erro ocorre porque você não pode alterar uma lista enquanto itera sobre ela (exceto pelo método remove() do próprio iterator()).
No seu caso, você está percorrendo a lista chickens e algum método (deve ser o setLastFire) está alterando essa lista (provavelmente adicionando um tiro?).
Não que isso vá fazer muita diferença para esse problema específico, mas a partir do Java 5, você pode usar uma sintaxe muito mais simples para percorrer listas;
public void tryToFire() {
for (ChickenEntrity c : chickens) {
if (System.currentTimeMillis() - c.getlastFire() >= c.getfiringInterval()) {
c.setlastFire(System.currentTimeMillis());
EggEntity shot = new EggEntity(this,"sprites/egg.gif",c.getX()+10,c.getY()+80);
eggs.add(shot);
}
}
}
PS: Você pode alterar o conteúdo da lista, isto é, mudar propriedades dos elementos dentro dela. O que você não pode é adicionar ou remover elementos.
elithin
Depois que vc falou dessa nova sintaxe eu modifiquei todos os for do programa para seguir este modelo
Vou tentar pensar em algo para solucionar este problema então. De repente eu adiciono os ovos criados no fim da iteração…
Obrigada de novo pela ajuda =}
ViniGodoy
Achei estranho pq eggs é uma lista, enquanto chickens é outra. Então, algo aí modifica a lista chickens (que é quem está sendo percorrida).
elithin
Bom, até onde eu sei nada modifica a lista. Alguns campos são alterados, se não me engano, mas nada remove ou inclui outro elemento na lista…
Só se algum outro método de criar ou excluir uma galinha estiver acontecendo em paralelo, o que definitivamente NÃO deveria estar acontecendo O.o
ViniGodoy
Estranho mesmo. Esse erro ocorre sempre? Joguei algumas vezes aqui sem que ele ocorresse.
elithin
ocorre bem raramente, na hora de iniciar o jogo.
junto a esse erro que aparece na linha de comando o jogo fica travado ( não inicia), e a janela pára de responder.
o único modo de encerrar o programa é pelo gerenciador de tarefas.