Java ConcurrentModificationException与抽象超类

时间:2018-11-15 04:10:39

标签: java libgdx concurrentmodification

所以我理解为什么我得到了错误;我想知道一个可行的解决方法!

因此,我有一个名为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(); 函数。

Player

我还有另一个SpriteRenderable类,它扩展了Gun类,因此它会自动添加到静态ArrayList中,并在每个渲染周期更新。这也与BulletGun类相同。

Bullet类和SpriteRenderable类也扩展了Player。在(Gdx.input.isButtonPressed(Input.Buttons.LEFT))类更新函数中,如果为Bullet shot = new Bullet();,则调用Guns Shoot方法,该方法随后会调用Exception in thread "LWJGL Application" java.util.ConcurrentModificationException

在播放器更新之前,它正常工作,并且播放器开火;实例化的项目符号会在自身循环时添加到静态ArrayList中。造成原因:

{{1}}

我尝试用try and catch来包围foreach(SpriteRenderable)循环;但是由于异常,最终没有渲染任何精灵。

1 个答案:

答案 0 :(得分:1)

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