Java:java.util.ConcurrentModificationException

标签 java arraylist

我正在制作 2D,目前正在研究用子弹射击。子弹是一个单独的类。所有项目符号都存储在一个名为 bullets 的数组列表中。当它超出屏幕的一侧(<-16)时,我试图让它 self 毁灭,但是当我尝试时它给了我这个错误。

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at GameCanvas.updateMovement(GameCanvas.java:94)
at GameCanvas.gameLoop(GameCanvas.java:63)
at GameCanvas.<init>(GameCanvas.java:28)
at GameClient.<init>(GameClient.java:68)
at GameClient.main(GameClient.java:29)

我假设它与何时被销毁有关,我正在使用此代码来销毁它:

public void move() {

    if(x > -16) {
        x -= move_speed;
    } else {
        kill();
    }

}

public void kill() {
    ObjectHandler.bullets.remove(this);
}

updateMovement() 方法:

public void updateMovement() {
    PlayerObject.update();

    for(Bullet bullet : ObjectHandler.bullets) {
        bullet.move();


    }

}

为什么要这样做?谢谢。

最佳答案

发生这种情况是因为您在迭代列表时正在修改它。

尝试“记住”您需要kill 的内容,并在通过整个列表后,浏览您的“内存”并执行适当的kill。这样,您将在遍历列表后对其进行修改。

例如:

public void move() {

    if(x > -16) {
        x -= move_speed;
    } else {
        ObjectHandler.remember_to_kill(this);
    }

}

// in ObjectHandler:

private HashSet<type_of_object_to_kill> kill_memory = new...;

public void remember_to_kill() {
    this.kill_memory.add(this);
}

private void kill_from_memory() {
    for (type_of_object_to_kill obj: kill_memory) {
        ObjectHandler.bullets.remove(this);
    }
    ObjectHandler.kill_memory.clear();
}

// update movement:

public void updateMovement() {
    PlayerObject.update();

    for(Bullet bullet : ObjectHandler.bullets) {
        bullet.move();
    }
    ObjectHandler.kill_from_memory();
}

关于Java:java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437139/

相关文章:

java - 如何比较两个包含具有共享属性的对象的数组列表

java - 如何使用 Apache Poi 更改工作表的选项卡颜色

java - 反序列化包含 List<Object> 的 Jackson/Json 对象,其中列表类型是对象中的属性

java - 将Bag数据结构与Set或Linkedlist等其他图形实现API相比,有什么优势?

java - 使用 @ResponseBody 和 spring 3 返回对象不起作用

java - Vector vs Collections.synchronizedList(ArrayList)

java - 我无法打印我的数组

java - java中数组索引越界

java - 在 LinkedList 和 ArrayList 之间没有明显优势的情况下,应该使用哪个?

java - Tomcat启动时实例化对象