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);
}
这样就不会引起错误 了。
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);
}
这样就不会引起错误 了。
相关文章推荐
- java.util.ConcurrentModificationException错误的原因及解决方法
- java.util.ConcurrentModificationException 异常的解决方法
- 分享以下编译错误:java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException的一种解决方法
- java.util.ConcurrentModificationException 异常解决的方法及原理
- java.util.ConcurrentModificationException异常 解决方法
- java.util.ConcurrentModificationException 解决方法
- java.util.ConcurrentModificationException的解决方法
- java.util.ConcurrentModificationException异常解决方法
- 关于hashMap的java.util.ConcurrentModificationException解决方法
- java使用Iterator迭代出现"java.uitl.ConcurrentModificationException"错误原因及解决方法概述
- java.util.ConcurrentModificationException异常参考解决方法
- java.util.ConcurrentModificationException原因及解决方法
- 关于 Java.util.ConcurrentModificationException 的讨论和解决方法
- java.util.ConcurrentModificationException 的解决方法
- java.util.ConcurrentModificationException的解决方法
- java.util.ConcurrentModificationException异常解决方法
- java.util.ConcurrentModificationException 解决办法(使用迭代器时出现异常)
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法
- Java ConcurrentModificationException异常原因和解决方法