我是靠谱客的博主 斯文小蘑菇,这篇文章主要介绍解决:java.util.ConcurrentModificationException: null:异常,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("ee"); list.add("ff"); list.add("gg"); list.add("hh"); list.add("kk"); list.add("yy"); list.add("oo"); list.forEach(s -> { list.add("tt"); }); } }

当我们迭代一个ArrayList或者HashMap时,如果尝试对集合做一些修改操作(例如删除元素),可能会抛出java.util.ConcurrentModificationException的异常。

复制代码
1
2
3
Exception in thread "main" java.util.ConcurrentModificationException     at java.util.ArrayList.forEach(ArrayList.java:1260)     at com.hzt.tool.Test.main(Test.java:28)


ArrayList的父类AbstarctList中有一个域modCount,每次对集合进行修改(增添元素,删除元素……)时都会modCount++ 而foreach的背后实现原理其实就是Iterator(关于Iterator可以看Java Design Pattern: Iterator),等同于注释部分代码。在这里,迭代ArrayList的Iterator中有一个变量expectedModCount,该变量会初始化和modCount相等,但如果接下来如果集合进行修改modCount改变,就会造成expectedModCount!=modCount,此时就会抛出java.util.ConcurrentModificationException异常

新增源码如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    /**      * Inserts the specified element at the specified position in this      * list. Shifts the element currently at that position (if any) and      * any subsequent elements to the right (adds one to their indices).      *      * @param index index at which the specified element is to be inserted      * @param element element to be inserted      * @throws IndexOutOfBoundsException {@inheritDoc}      */     public void add(int index, E element) {         rangeCheckForAdd(index);         ensureCapacityInternal(size + 1);  // Increments modCount!!         System.arraycopy(elementData, index, elementData, index + 1,                          size - index);         elementData[index] = element;         size++;     }    private void ensureCapacityInternal(int minCapacity) {         ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));     }     private void ensureExplicitCapacity(int minCapacity) {         modCount++;         // overflow-conscious code         if (minCapacity - elementData.length > 0)             grow(minCapacity);     }


说明modCount++ 此时expectedModCount!=modCount 报错 我的解决办法就是

复制代码
1
2
3
for (int i = 0; i < list.size(); i++) {             list.add("tt"); }

转载自我的博客https://www.51csdn.cn/article/370.html

最后

以上就是斯文小蘑菇最近收集整理的关于解决:java.util.ConcurrentModificationException: null:异常的全部内容,更多相关解决:java.util.ConcurrentModificationException:内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部