代码之家  ›  专栏  ›  技术社区  ›  Isaac Manzi

带有抽象超类的Java ConcurrentModificationException

  •  0
  • Isaac Manzi  · 技术社区  · 7 年前

    所以我明白为什么我会出错;我想知道一个工作周围,如果可能或替代!

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

    public static ArrayList<SpriteRenderable> spriteRenderables;
    

    还具有静态功能 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();
    

    我还有一节课 Player 这扩展了 类,因此它会自动添加到静态ArrayList,并在每个渲染周期更新。这和 Gun Bullet

    这个 阶级和 类扩展 也在 玩家 (Gdx.input.isButtonPressed(Input.Buttons.LEFT)) 然后调用Guns shoot方法,该方法在tern中调用 Bullet shot = new Bullet();

    在玩家更新,玩家开火之前,这一切正常;实例化的项目符号在循环自身时添加到静态ArrayList。造成:

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

    我试着用一个环捕捉它;但是,由于该异常,最终无法渲染任何精灵。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Saptarshi Basu    7 年前

    假设您在列表中迭代的次数比修改的次数多,那么您就可以使用 CopyOnWriteArrayList . 但是,迭代器生命周期内的任何修改对迭代器都不可见。