列苗

越学习,越发现自己的无知

java.util.ConcurrentModificationException 异常

参考自 Java ConcurrentModificationException异常原因和解决方法

一、异常再现

导致异常代码:

@Test
public void d() {
     List<String> l = new ArrayList<>();
     l.add("a");
     l.add("b");
     l.add("c");

     for (String s : l) {
         if ("a".equals(s)) {
             l.remove(s);
         }
     }
 }

异常:
这里写图片描述

二、原因

ArrayList 在迭代的时候,对其进行修改会抛出 java.util.ConcurrentModificationException 异常。

原因为调用 ArrayList 的remove() 方法时,只修改了 modCount 变量的值,而迭代 ArrayList 时的next() 方法要判断 modCount 和 expectCount 的值是否相等,不相等则抛出 ConcurrentModificationException 异常。

ArrayList 的 remove() 方法:
这里写图片描述

ArrayList 的内部类 Itr 的 next() 方法:
这里写图片描述

三、解决

使用 Iterator 迭代容器,并且使用ArrayList 的内部类 Itr 的 remove() 方法:

这里写图片描述

该方法内 expectedModCount = modcount; 使得这两个变量的值相同,可以正常迭代。

代码如下:

@Test
public void d() {
    List<String> l = new ArrayList<>();
    l.add("a");
    l.add("b");
    l.add("c");

    Iterator<String> iter = l.iterator();
    while (iter.hasNext()) {
        String s = iter.next();
        if ("a".equals(s)) {
            iter.remove();
        }
    }

    for (String s : l) {
        System.out.println(s);
    }
}

输出为:
这里写图片描述

阅读更多
文章标签: arraylist java 异常
个人分类: Java 基础
上一篇Java 基础之日期操作总结
下一篇iBastis 之count, sum操作
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭