【发布时间】:2014-02-17 23:52:14
【问题描述】:
occupants 是一个 java.util.ArrayList。
我正在像这样迭代它
public void hitOccupants(SnakeController snakeController){
ListIterator<Hitable> i = occupants.listIterator();
while( i.hasNext()){
Hitable hitable = i.next();
if(hitable.hit(snakeController)){//returns true if it should be deleted
i.remove();
}
}
}
我可以弄清楚为什么这会产生 ConcurrenModificationException... 我正在使用 libgdx,因此可能存在线程问题。这是我的第一个 libgdx 项目,所以我不确定。在安卓上运行代码。堆栈跟踪:
java.util.ConcurrentModificationException
at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:71)
at com.ninovanhooff.snake.model.BoardSpace.hitOccupants(BoardSpace.java:65)
at com.ninovanhooff.snake.controller.SnakeController.act(SnakeController.java:77)
at com.ninovanhooff.snake.controller.BoardController.act(BoardController.java:72)
at com.ninovanhooff.snake.GameActor$2.act(GameActor.java:77)
at com.badlogic.gdx.scenes.scene2d.Actor.act(Actor.java:86)
at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48)
at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48)
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:225)
at com.ninovanhooff.snake.SnakeGame.render(SnakeGame.java:66)
at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:510)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
【问题讨论】:
-
Hitable.hit 会修改列表吗?
-
是的,在您迭代列表时,还有其他东西正在修改列表。您在自己的迭代中正确使用了迭代器的
remove()方法,所以这不是问题。 -
是的,
hit方法有什么作用?粘贴代码。 -
这段代码每次运行时都会出现这个异常吗?还是只是偶尔?发生这种情况时,列表有什么特别之处吗(单元素列表等)?
-
投票结束“信息不足”。发布的代码很好:使用
i.remove()在迭代列表时修改列表。 @Nino:如果您可以发布更多关于occupants是什么以及它的定义位置以及程序如何工作的信息,我们或许可以提供帮助。如果多个线程正在调用它,它可能就像声明这个方法synchronized一样简单。
标签: java android iterator libgdx