ConcurrentModificationException异常及解决方案

有时候我们在遍历map集合或list集合时经常会出现如下异常:
Exception in thread "main" java.util.ConcurrentModificationException
	at 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值