【问题标题】:Removing something from array but game crashes从数组中删除某些东西但游戏崩溃
【发布时间】:2014-10-27 14:48:52
【问题描述】:

我有一个数组,我在平铺地图上创建了几把剑,当我踩到它们时,它们需要被删除,但是当我踩到它们时,游戏会崩溃。

在 java.util.ArrayList$Itr.checkForComodification(未知来源) 在 java.util.ArrayList$Itr.next(Unknown Source)

我的代码:

我猜循环正在寻找对象,即使它被删除了?

private List<Sword> swords = new ArrayList<Sword>();

我一次创建它们:

public GameRender(GameWorld world, int gameHeight) {
    for (int i = 0; i<100 ; i++ ) {
        swords.add(new Sword());
        }

当我踩到它时:

for (Sword sword : swords) { 
        if(playery+7>=sword.position.y && playery+7<=sword.position.y+tilesize
        && playerx+7>=sword.position.x &&playerx+7<=sword.position.x+tilesize) {
                sword.pickMe();   
                swords.remove(sword);
        }
    }

render() 中还有其他循环:

for (Sword sword : swords) {
        sword.createMe();
    }

我认为你不需要看剑类。如果你这样做,我会把它放在这里。我该如何解决它,以免出现错误?

【问题讨论】:

  • ConcurrentModificationException 因为您使用的是增强的 for 循环,因此隐含了一个迭代器。迭代时不能修改正在迭代的列表。
  • 对不起,我不太明白。我不太懂编码的英语。你能用代码告诉我这是如何工作的吗?
  • 我同时也发布了一个答案:p

标签: java arrays libgdx


【解决方案1】:
for (Sword sword : swords) { 
        if(playery+7>=sword.position.y && playery+7<=sword.position.y+tilesize
        && playerx+7>=sword.position.x &&playerx+7<=sword.position.x+tilesize) {
                sword.pickMe();   
                swords.remove(sword); //this line throws ConcurrentModificationException
        }
}

由于增强的for 循环的工作方式,您需要使用Iterator&lt;Sword&gt; 将其删除:

Iterator<Sword> iterator = swords.iterator();
while(iterator.hasNext())
{
    Sword sword = iterator.next();
        if(playery+7>=sword.position.y && playery+7<=sword.position.y+tilesize
        && playerx+7>=sword.position.x &&playerx+7<=sword.position.x+tilesize) {
                sword.pickMe();   
                iterator.remove();
        }
}

或以下:

  for (int i = 0; i < swords.size(); i++) { 
        Sword sword = swords.get(i);
        if(playery+7>=sword.position.y && playery+7<=sword.position.y+tilesize
        && playerx+7>=sword.position.x &&playerx+7<=sword.position.x+tilesize) {
                sword.pickMe();   
                swords.remove(i--);
        }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多