我在处理一个项目时遇到了问题。程序有一个主循环,每帧都会调用
我有一个名为
我试图在我的
然而,当我运行程序时,在这行代码处收到了一个ConcurrentModificationException异常:
update()
方法。我有一个名为
World
的对象,其中包含一个 HashMap<ChunkPos, Chunk>
,其中ChunkPos
是一个数据结构,它具有xyz位置,代表了Chunk
在World
中的位置。我试图在我的
update
函数中迭代遍历世界中的所有块,因为每个块都有自己的 GameObject
的数组列表,该列表包含世界中的所有对象。public void update() {
HashMap<ChunkPos, Chunk> chunkMap = world.getChunkMap();
Iterator<Map.Entry<ChunkPos, Chunk>> it = chunkMap.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<ChunkPos, Chunk> item = it.next();
ArrayList<GameObject> chunkObjects = item.getValue().getObjects();
for(GameObject obj : chunkObjects) {
obj.update();
}
}
}
然而,当我运行程序时,在这行代码处收到了一个ConcurrentModificationException异常:
Map.Entry<ChunkPos, Chunk> item = it.next();
我已经尝试了多种不同的迭代HashMap的方法,但每次都遇到相同的错误。我做错了什么?
如果有帮助的话,以下是完整的StackTrace:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
at java.util.HashMap$EntryIterator.next(HashMap.java:1463)
at java.util.HashMap$EntryIterator.next(HashMap.java:1461)
at com.anzanama.lwjgl3d.Game.Game.update(Game.java:40)
at com.anzanama.lwjgl3d.Game.Game.loop(Game.java:31)
at com.anzanama.lwjgl3d.Main.main(Main.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
我想在这里做一个说明:最终我实现了一个WorldChangeScheduler,它将安排在整个世界迭代并更新后进行更改。这使得它更加鲁棒,并且有额外的好处,即我以后可以将这些WorldChanges转换为其他人可以连接到我的引擎的事件。
obj.update();
内部修改了 HashMap。除非通过迭代器本身进行操作,否则在迭代集合时不能修改它。 - Erwin Bolwidt