`
woshixushigang
  • 浏览: 564476 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

java.util.ConcurrentModificationException

 
阅读更多

调整新鲜事时候报错:

严重: Servlet.service() for servlet chenming threw exception
java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
	at java.util.AbstractList$Itr.next(Unknown Source)
	at com.bitbao.cm.service.impl.ContactRelationshipServiceImpl.getAPIGroupWithContact(ContactRelationshipServiceImpl.java:147)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

 最后发现错误在这里:

 

  for (GroupVO g: groups) {
            if (g.getMembers().size()==0) groups.remove(g);
        }

 

遍历list的同时又对list remove 是不可以的。

 

又如iterator遍历时候 remove掉 list里面一个对象就会报错。

 

Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics