Java ConcurrentModificationException с абстрактным суперклассом - PullRequest
0 голосов
/ 15 ноября 2018

Итак, я понимаю, почему я получаю ошибку; Я хотел бы узнать обходной путь, если это возможно, или альтернативу!

Итак, у меня есть класс с именем SpriteRenderable, который используется для сортировки и рендеринга всех объектов на экране, он содержит позицию и спрайт для экземпляров.

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, поэтому он автоматически добавляется в статический ArrayList и обновляется при каждом цикле рендеринга. Это то же самое, что и классы Gun и Bullet.

Класс Gun и класс Bullet также расширяются SpriteRenderable. В функции обновления классов Player, если (Gdx.input.isButtonPressed(Input.Buttons.LEFT)), то вызывается метод стрелкового оружия, который в крачке вызывает Bullet shot = new Bullet();

Это работает нормально, пока игрок не обновится, и игрок не выстрелит из оружия; инстанцированные маркеры добавляются в статический ArrayList при прохождении через себя. Причинение:

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

Я пытался окружить цикл foreach (SpriteRenderable) с помощью try and catch; однако это приводит к тому, что ни один из спрайтов не оказывается из-за исключения.

1 Ответ

0 голосов
/ 15 ноября 2018

Если вы итерируете больше по списку, чем изменяете его, вам будет хорошо с CopyOnWriteArrayList. Однако любые изменения во время жизни итератора не будут видны итератору.

...