ConcurrentModificationException异常及解决方案

来源:互联网 发布:历史股价数据 编辑:程序博客网 时间:2024/05/18 03:02
有时候我们在遍历map集合或list集合时经常会出现如下异常:Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)at java.util.AbstractList$Itr.next(AbstractList.java:343)at com.test.Test.main(Test.java:34)

比如在遍历map集合时如下实例:

package com.test;import java.util.ArrayList;import java.util.List;import com.bean.Person;public class Test {public static void main(String[] args) {List<Person> l=new ArrayList<Person>();Person p=new Person(2, "lisi");Person p0=new Person(2, "lisi1");Person p3=new Person(2, "lisi1");Person p1=new Person(3, "lisi2");Person p2=new Person(4, "lisi3");l.add(p2);l.add(p1);l.add(p0);l.add(p);l.add(p3);List<Person> l1=new ArrayList<Person>();for (Person person : l) {if(person.getPname().equals("lisi1")){l.remove(person);}}for (Person person : l) {System.out.println(person);}}
运行后会出现上述异常;

解决方案:

原因是在遍历一个map集合时,对容器中的数据进行数量的增加和减少惭怍就会抛出该异常;主要的原因是:当在遍历一个map容器时,此时map中的数量已经个数已经赋值给一个变量exceptionModCount,在调用next()方法时,会先比较该变量的值与容器中的实际个数modeCount的值是否相等,若二者不相等,则会抛出ConcurrentModificationException异常,因此在使用容器遍历时,如果对容器进行增加或删除操作,就会改变容器中对象的数量,从而导致抛出异常。解决方法如下:在遍历的过程中把需要删除的对象先保存在一个集合中,等遍历结束后在调用removeAll()方法来删除。

具体实现的方式:

package com.test;import java.util.ArrayList;import java.util.List;import com.bean.Person;public class Test {public static void main(String[] args) {List<Person> l=new ArrayList<Person>();Person p=new Person(2, "lisi");Person p0=new Person(2, "lisi1");Person p3=new Person(2, "lisi1");Person p1=new Person(3, "lisi2");Person p2=new Person(4, "lisi3");l.add(p2);l.add(p1);l.add(p0);l.add(p);l.add(p3);List<Person> l1=new ArrayList<Person>();for (Person person : l) {if(person.getPname().equals("lisi1")){l1.add(person);}}l.removeAll(l1);for (Person person : l) {System.out.println(person);}}}

修改后运行正确:




阅读全文
1 0