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

問題は、反復しているコレクションが反復中の変更をサポートしていないことです。

ConcurrentModificationException

コレクションから「悪い」エントリを除外する必要があるのはよくあることです。通常、私は次のようにします。

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);

この方法の利点は、イテレータを気にする必要がなく、元のコレクションをループするだけでよいことです。

イテレータを使用することを選択した場合は、@ mschenk74 で説明されているように、remove メソッドを使用してください。

于 2013-05-16T19:34:13.660 に答える