0

我遇到并发修改异常的问题。我已将代码更改为使用迭代器,但是当我删除对象时仍然遇到这些问题。我的错误发生在线

theEnemy = (Enemy) EnemyItr.next();

我不确定如何解决这个问题,因为它是代码中非常重要的一部分。

for (Iterator EnemyItr = activeEnemies.iterator(); EnemyItr.hasNext(); ){

    theEnemy = (Enemy) EnemyItr.next(); 
    try {

        try {

            if (theEnemy.x < 0 && theEnemy.y >= 5) {
                activeEnemies.remove(theEnemy);
            }
        } catch (Exception e) {
            System.err.println("Cannot Remove Enemy");
        }

        Enemy.pathFind(Enemy.getXBlockOfEnemy(theEnemy.x), Enemy.getXBlockOfEnemy(theEnemy.y), theEnemy.x, theEnemy.y);

        if (Enemy.right) {
            theEnemy.x += Enemy.speed;
            //System.out.println("right");
            //System.out.println(theEnemy.x + " " + theEnemy.y);
        } else if (Enemy.down) {
            theEnemy.y += Enemy.speed;
            //System.out.println("down");
            //System.out.println(theEnemy.x + " " + theEnemy.y);;
        } else if (Enemy.up) {
            theEnemy.y -= Enemy.speed;
            //System.out.println("up");
            //System.out.println(theEnemy.x + " " + theEnemy.y);
        } else if (Enemy.left) {
            theEnemy.x -= Enemy.speed;
            //System.out.println("left");
            //System.out.println(theEnemy.x + " " + theEnemy.y);
        } else {
            System.out.println("Enemy Lost.");
            //System.out.println(theEnemy.x + " " + theEnemy.y);
        }

        g.drawImage(enemy, theEnemy.x, theEnemy.y, this);
        //System.out.println(Enemy.getXBlockOfEnemy(theEnemy.x));

        //drawing health bar
        if (Input.displayUI) {
            g.setColor(Color.LIGHT_GRAY);
            g.fillRect(theEnemy.x, theEnemy.y - 10, 70, 10);
            g.setColor(Color.RED);
            g.fillRect(theEnemy.x + 2, theEnemy.y - 10 + 1, 68, 8);
            g.setColor(Color.GREEN);
            g.fillRect(theEnemy.x + 2, theEnemy.y - 10 + 1, (int) (.68 * theEnemy.enemylife), 8);
        }

    } catch (ConcurrentModificationException e) {
        theEnemy = null;
    }

}
4

3 回答 3

3

在迭代集合时从集合中移除元素的唯一机会是使用迭代器本身的 remove() 方法。但由于这是一种可选方法,如果您的迭代器不支持 remove 方法,您可能必须使用此处其他答案的建议。

简而言之:使用迭代器的remove方法而不是集合本身的remove方法。

于 2013-05-16T19:17:54.583 回答
1

问题是您正在迭代的集合在迭代时不支持修改。

并发修改异常

从集合中过滤掉“坏”条目是一种常见的需求。通常,我会这样做:

public void filter(Collection<MyObject> myObjectsToFilter) {
    final Collection<MyObject> toRemove = new HashSet<MyObject>();
    for(MyObject myObject : myObjectsToFilter) {
        if(myObject.specificCondition()) {
            toRemove.add(myObject);
        }
    }
    myObjectsToFilter.removeAll(toRemove);
}

此示例保留要删除的对象的单独集合。它是在迭代发生时建立的,迭代完成后,它会删除所有条目。

于 2013-05-16T18:55:45.440 回答
1

一个典型的解决方案是创建一个列表,比如说,removeList所有要删除的项目。不要在循环期间立即移除敌人,而是将其添加到removeList. 在循环结束时,调用activeEnemies.removeAll(removeList);

这种方式的一个优点是您不需要使用迭代器,您只需遍历原始集合即可。

如果您确实选择使用迭代器,请使用它的 remove 方法,如@mschenk74 所述

于 2013-05-16T19:34:13.660 回答