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,并在每个渲染周期更新。这与 Gun
和 Bullet
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
会很好。然而,在迭代器的生命周期内的任何修改对迭代器都是不可见的。
所以我明白为什么会出现错误;如果可能的话,我想知道解决方法或替代方法!
所以我有一个名为 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,并在每个渲染周期更新。这与 Gun
和 Bullet
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
会很好。然而,在迭代器的生命周期内的任何修改对迭代器都是不可见的。