最近在模仿着写一个雷电游戏,其中有一段源代码是这样的:
for (int j = 0; j < enemys.size(); j++) {
Enemy ene = enemys.get(j);
if (ene.y < height) {
ene.draw(canvas, x);
} else {
enemys.remove(ene);
}
}
而我自己最初写的时候是这样:
i = enemys.iterator();
while(i.hasNext()) {
Enemy ene = (Enemy) i.next();
if(ene.y < cxf_height) {
ene.draw(canvas, x);
} else {
enemys.remove(ene);
}
}
乍一看,好像没什么问题,实际运行时就会报"ConcurrentModificationException"异常。
细节不想多说,百度谷歌一大堆,总的来说就是你在迭代的时候执行被迭代对象的remove方法,会使Iterator里的两个属性值modCount与expectedModCount不统一,即导致索引的一致性遭到破坏。然后根据fail-fast原则,Iterator就会立即抛出"java.uitl.ConcurrentModificationException"。
所以,当使用Iterator迭代的时候,不允许被迭代的对象被改变;应该使用iterator本身的的remove()方法来删除对象。如上述代码,不能出现enemys.remove(ene)。
应改为这样:
i = enemys.iterator();
while(i.hasNext()) {
Enemy ene = (Enemy) i.next();
if(ene.y < cxf_height) {
ene.draw(canvas, x);
} else {
i.remove();
}
}