Java 带有抽象超级的 ConcurrentModificationException class

Java ConcurrentModificationException with abstract super class

所以我明白为什么会出现错误;如果可能的话,我想知道解决方法或替代方法!

所以我有一个名为 SpriteRenderable 的 class,它用于对屏幕上的所有对象进行排序和渲染,它包含实例的位置和精灵。

public static ArrayList<SpriteRenderable> spriteRenderables;

SpriteRenderable 也有一个静态函数 Render(SpriteBatch batch) 循环遍历此列表以在每个列表上调用 update 函数。

public static void Render() {
    spriteBatch.begin();
    for (ListIterator<SpriteRenderable> iter = 
        spriteRenderables.listIterator(); iter.hasNext();) {
        SpriteRenderable spriteRenderable = iter.next();
        spriteRenderable.update(delta);
        spriteRenderable.sprite.draw(spriteBatch);
        }
    spriteBatch.end();
}

public abstract void update();

我有另一个 class Player 扩展了 SpriteRenderable class,所以它会自动添加到静态 ArrayList,并在每个渲染周期更新。这与 GunBullet class 相同。

Gun class 和 Bullet class 也扩展了 SpriteRenderable。在 Player classes 更新函数中,如果 (Gdx.input.isButtonPressed(Input.Buttons.LEFT)) 则调用 Guns shoot 方法,后者调用 Bullet shot = new Bullet();

在更新播放器并且播放器开枪之前,这可以正常工作;实例化的项目符号在循环遍历自身时被添加到静态 ArrayList 中。导致:

Exception in thread "LWJGL Application" java.util.ConcurrentModificationException

我试过用 try and catch 包围 foreach(SpriteRenderable) 循环;然而,由于异常,这最终不会渲染任何精灵。

假设您遍历列表的次数多于修改列表的次数,那么 CopyOnWriteArrayList 会很好。然而,在迭代器的生命周期内的任何修改对迭代器都是不可见的。