您的位置:首页 > 产品设计 > UI/UE

java使用Iterator迭代出现"java.uitl.ConcurrentModificationException"错误原因及解决方法概述

2013-07-02 21:55 901 查看
最近在模仿着写一个雷电游戏,其中有一段源代码是这样的:

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();
}
}


细节可参考: http://zhoujianghai.iteye.com/blog/1041555
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息