异常java.util.ConcurrentModificationException之如何遍历删除集合中的元素

异常:java.util.ConcurrentModificationException
       at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
       at java.util.ArrayList$Itr.next(ArrayList.java:851)
       at com.mediwit.illcase.service.impl.CaseIdService.getTreatCompanyList(CaseIdService.java:1237)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

               ....

原因:出现该异常的原因大多数情况下是在遍历集合的时候,执行了对集合元素的删除,如下所示:

 public void test() {
 try {
 ArrayList<String> list = new ArrayList<String>();
 list.add("company1");
 list.add("company2");
 list.add("company3");
 list.add("company4");
 for (String string : list) {
 if(string.equals("company1")) {
 list.remove(string);
 }
 }
 }catch(Exception e) {
 e.printStackTrace();
 }

  }

而集合元素在进行更改的时候会触发一个   checkForComodification()  方法,方法中有这么一段代码:

  if(modCount != exceptedModCount)
        throw new ConcurrentModificationException();
  }

调用list.remove()后导致了modCount!=exceptiedModCount,所有就抛异常了;

解决

使用迭代器遍历,调用迭代器的删除方法:如下所示

Iterator<String> it = list.iterator();
     while(it.hasNext()) {

           String curStr = it.next();   

               if("company1".equals(curStr)){

                         it.remove();

                }

     }


猜你喜欢

转载自blog.csdn.net/jifengdalu/article/details/80460329