java使用Iterator迭代出现"java.uitl.ConcurrentModificationException"错误原因及解决方法概述
2013-07-02 21:55
901 查看
最近在模仿着写一个雷电游戏,其中有一段源代码是这样的:
而我自己最初写的时候是这样:
乍一看,好像没什么问题,实际运行时就会报"ConcurrentModificationException"异常。
细节不想多说,百度谷歌一大堆,总的来说就是你在迭代的时候执行被迭代对象的remove方法,会使Iterator里的两个属性值modCount与expectedModCount不统一,即导致索引的一致性遭到破坏。然后根据fail-fast原则,Iterator就会立即抛出"java.uitl.ConcurrentModificationException"。
所以,当使用Iterator迭代的时候,不允许被迭代的对象被改变;应该使用iterator本身的的remove()方法来删除对象。如上述代码,不能出现enemys.remove(ene)。
应改为这样:
细节可参考: http://zhoujianghai.iteye.com/blog/1041555
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
相关文章推荐
- java.util.ConcurrentModificationException错误的原因及解决方法
- 使用set时发生Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- 并发编程修炼八:Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- java.util.ConcurrentModificationException 解决办法(使用迭代器时出现异常)
- Java并发编程:Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- 【JAVA集合详解】Java ConcurrentModificationException异常原因和解决方法