【发布时间】:2018-06-24 05:35:45
【问题描述】:
所以我正在用 Java 制作一个小游戏,在游戏中你有存储在 LinkedList 中的实体。在 tick 方法中,我像这样遍历实体的 LinkedList:
@Override
public void tick(float delta) {
for (Entity e : entities) {
e.tick(delta);
}
player.tick(delta);
}
渲染方法也一样
@Override
public void render(Graphics g) {
g.setColor(Color.DARK_GRAY);
g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
for(Entity e : entities) {
e.render(g);
}
player.render(g);
}
其中一个实体是一个名为 Block 的类。在 Block 类中,有一个函数会在附近有块时返回,在这个函数中,我还遍历了 Entities 的 LinkedList,它是从 Block 中的以下 tick 方法调用的:
@Override
public void tick(float delta) {
if (color == Color.WHITE) {
if (getSurrounding(-32, -32) != null && getSurrounding(-32, -32).getColor() == Color.BLACK) {
if (getSurrounding(-32, -32).getStrength() < strength) {
getSurrounding(-32, -32).setStrength(-50);
}
}
}
if (!inGame.entities.isEmpty() && strength <= 0) {
inGame.entities.remove(this); // <------ REMOVING AN ELEMENT
}
}
public Block getSurrounding(int xOffset, int yOffset) {
for (Entity e : inGame.entities) {
if (e instanceof Block) {
if (x + xOffset == e.getX() && y + yOffset == e.getY()) {
return (Block) e;
}
}
}
return null;
}
(这个函数是在block的tick方法中调用和使用的)
现在每次我运行游戏时,游戏都会启动并正常运行几毫秒,然后抛出此异常:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at _47b3n.game.engine.gamestate.gamestates.InGame.tick(InGame.java:36)
at _47b3n.game.engine.Handler.tick(Handler.java:17)
at _47b3n.game.engine.Game.tick(Game.java:70)
at _47b3n.game.engine.Game.run(Game.java:52)
at java.lang.Thread.run(Unknown Source)
(前两个代码示例在InGame.java文件中,第36行是tick方法中的for循环) 现在如何停止这个错误?
【问题讨论】:
-
迭代时不要从列表中删除元素。
-
@hellzone 这并不完全正确。如果他使用
Iterator,它会起作用 -
@hellzone 看来发帖者没有删除任何内容
-
@hellzone 我只是在迭代后删除块的 tick 方法中的元素等。所以这不是问题吗?
-
显然是这样,否则你不会得到异常
标签: java linked-list iteration