Java 更新Arraylist中的项会引发ConcurrentModificationException

Java 更新Arraylist中的项会引发ConcurrentModificationException,java,arraylist,lwjgl,slick,Java,Arraylist,Lwjgl,Slick,我正在用lwjgl和slick用java制作一个游戏。我有一个世界,它包含一个arraylist,所有项目都放在需要更新的地方。但当它第二次更新这些项时,会抛出ConcurrentModificationException 我怎样才能解决这个问题 这是完整的错误:线程主java.util.ConcurrentModificationException中出现异常 在java.util.ArrayList$Itr.checkForComodificationUnknown源中 位于java.util

我正在用lwjgl和slick用java制作一个游戏。我有一个世界,它包含一个arraylist,所有项目都放在需要更新的地方。但当它第二次更新这些项时,会抛出ConcurrentModificationException

我怎样才能解决这个问题

这是完整的错误:线程主java.util.ConcurrentModificationException中出现异常 在java.util.ArrayList$Itr.checkForComodificationUnknown源中 位于java.util.ArrayList$Itr.nextUnknown Source 位于com.jakibah.infinyvale.World.HandleItemsWorld.java:43 位于com.jakibah.infinyvale.World.UpdateWorld.java:65 位于com.jakibah.infinyvale.Game.UpdateGame.java:29 位于com.jakibah.infinyvale.Canvas.CreateCanvasCanvas.java:41 位于com.jakibah.infinyvale.Game.mainGame.java:16

这是我的代码: 世界:


}

迭代时,您正在从ArrayList中删除一个项,并导致它抛出ConcurrentModificationException

让我们跟踪您的代码

    public synchronized void HandleItems() {
        if (!items.isEmpty()) {
            for (Item i : items) {
                i.Update();
            }
        }
    }
这将调用项对象上的更新,即:

    public void Update() {
        Draw();
        CheckPickUp();
    }
    public void CheckPickUp(){
        if(Canvas.isColliding(Game.p.getX(), Game.p.getY(), Game.p.getX() + 32, Game.p.getY() - 32, x, y));
        System.out.println("Colliding");
        this.ToBag();
    }

    public void ToBag() {
        Inventory i = null;
        i = Game.p.getI();
        Game.world.getItems().remove(this);
        i.getInventory().add(new BagItem(type, i, tex, texturefactor, durability, power));
    }
注意烟草。您正在从实际上正在迭代的集合中删除Item对象

基本上,您必须使用迭代器,而不是直接从arraylist中删除

有关更多说明,请参阅本网站中的类似问题:

您是Item.toBag导致此异常。line Game.world.getItems.removethis;正在尝试从ArrayList中删除该项


不能在for each循环中修改列表。您只能在直接使用迭代器时调用remove方法。

将代码以文本形式粘贴到此处,格式正确。不要发布指向外部源的链接;iterator.hasNext;{Item Item=iterator.next;ifitem==this{iterator.remove;}}现在它仍然抛出一个错误。您必须在HandleItem方法中使用它,并以某种方式将迭代器传递到您删除的位置。
    public synchronized void HandleItems() {
        if (!items.isEmpty()) {
            for (Item i : items) {
                i.Update();
            }
        }
    }
    public void Update() {
        Draw();
        CheckPickUp();
    }
    public void CheckPickUp(){
        if(Canvas.isColliding(Game.p.getX(), Game.p.getY(), Game.p.getX() + 32, Game.p.getY() - 32, x, y));
        System.out.println("Colliding");
        this.ToBag();
    }

    public void ToBag() {
        Inventory i = null;
        i = Game.p.getI();
        Game.world.getItems().remove(this);
        i.getInventory().add(new BagItem(type, i, tex, texturefactor, durability, power));
    }