【发布时间】:2015-09-03 04:18:48
【问题描述】:
我正在尝试为鲨鱼和鱼互相吃食并模拟人口控制等的模拟 WaTor 编写代码。无论如何,我遇到的问题是,即使使用迭代器,我也会不断收到并发修改异常。
这是我的代码:
private void updateSharks() {
for(Iterator<Shark> sharkit = sharks.iterator(); sharkit.hasNext();) {
Shark sharky = sharkit.next();
if(sharky.hasStarved()) {
sharkit.remove();
}
else if(sharky.canBreed()) {
addNewShark(sharky.getX(),sharky.getY());
}
moveShark(sharky);
}
}
这里是个例外:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at WaTor.Ocean.updateSharks(Ocean.java:281)
at WaTor.Ocean.update(Ocean.java:307)
at WaTor.Main.main(Main.java:13)
海洋中的第 281 行是“Shark Sharky = Sharkit.next();”感谢您的帮助!
【问题讨论】:
-
使用迭代器遍历集合时不能修改集合。例如,检查此答案以了解实现您想要的方法:stackoverflow.com/q/122105/4250114
-
我猜
addNewShark或moveShark应该归咎于此;他们可能以不安全的方式访问收藏。 -
另外,关于你的堆栈跟踪:它抛出的原因是因为
Iterator.next是它检查商品化的时候(你可以从跟踪中的方法中猜到)。它不会发生在您实际对集合进行商品化的时候。
标签: java debugging arraylist iterator