您的位置:首页 > 编程语言 > Java开发

java.util.ConcurrentModificationException错误的解决方法

2011-07-05 19:49 495 查看
首先模拟这个错误的发生场景。
public void list(){
List testList = new ArrayList();
int a =1;
int b =2;
int c =3;
testList.add(a);
testList.add(b);
testList.add(c);
for(Object o :testList){
if(Integer.valueOf(o.toString())>2){
testList.remove(o);
}
}
}
这个错误的场景是,在遍历List集合的时候,有一个判断,符合条件之后调用list的remove方法,将这个元素从List里清除掉。
我们跟踪调试,发现错误是在调用Remove方法这一行。错误的原因是什么呢?
我们知道集合的存储结构是单向链表,就是在内存中一个元素占用一小块内存,这一小块内存分两部分,一部分存储元素本身,另一部分存储下一个元素的地
址,在进行循环遍历的时候,程序会给这个循环加上一个mutex锁,进行remove操作之后,根据上一个元素查找下一个元素的地址,查找不到,结果就报上面的
错误。
这个错误该怎么解决呢?有两个解决方案。
第一种:既然他在进行遍历的时候会加锁,我不进行循环不就行了。采用最原始的迭代方法,如下
for(int i =0;i<testList.size();i++){
Object o =testList.get(i);
if(Integer.valueOf(o)){
testList.remove(i);
}
}
第二种:如果我还是想用上面的迭代方法怎么办呢。凉拌。
错误是在remove方法这一行报错的。我可以把要remove的元素放到一个List集合里面,在循环完成之后再进行移除。如下:
List test List 1= new ArrayList();
for(Object o :testList){
if(Intege.valueOf(o)){
list1.add(o);
}
//完成迭代之后
testList.removeAll(list1);
}
这样就不会引起错误 了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: