博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.util.concurrentmodificationexception 当在循环中 给List 添加对象或者 remove 对象是时候...
阅读量:4957 次
发布时间:2019-06-12

本文共 3504 字,大约阅读时间需要 11 分钟。

最近在项目中再循环中删除当前list 的对象或者添加list的对象的时候   报了这个错误。

在Console 中可以发现是这个方法中报了错误:

checkForComodification()

/**     * An optimized version of AbstractList.Itr     */    private class Itr implements Iterator
{ int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } @Override @SuppressWarnings("unchecked") public void forEachRemaining(Consumer
consumer) { Objects.requireNonNull(consumer); final int size = ArrayList.this.size; int i = cursor; if (i >= size) { return; } final Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) { throw new ConcurrentModificationException(); } while (i != size && modCount == expectedModCount) { consumer.accept((E) elementData[i++]); } // update once at end of iteration to reduce heap write traffic cursor = i; lastRet = i - 1; checkForComodification(); } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }

从这里可以看到,这里会比较现在的 Count 是否是期待的   有点类似于 CAS 的思想 , 就是会比较下List 的坐标。

那么我们该如何解决呢?

对于 Remove 

我们可以 把List  转换为  iterator  , 利用While  来进行 remove  。

例子:

Iterator
> iterator = RecordList.iterator();
while (iterator.hasNext()) {            ImportResultEachRow
item = iterator.next(); if (StringUtils.isNotBlank(item.getTargetObject().getDeleted()) && !StringUtils.equals(item.getTargetObject().getDeleted().toUpperCase(), "Deleted")){
iterator.remove(); } }

这样子就可以在List 循环中删除掉  元素了。

对于Add()

同样的 我们也可以进行转换, 但是iterator 是没有提供Add 的方法, 所以我们可以用  ListIterator 这样子我们就可以使用add  方法来进行 添加元素了。

 
ListIterator
iterator = SameValueDays.listIterator();
while (iterator.hasNext()) {            ReportDTO oneRowInfo = iterator.next();                    if (oneRowInfo.getAmount() == null && !hasOutward) {                        ReportDTO otherRowInfo = new ReportDTO();                        iterator.add(otherRowInfo );   } }

这样子就可以 放心的在循环中 添加了。

 对了 我这个方案 只能在  单线程中使用。  如果是多线程  请参考下面的文章。

引用文章:http://www.cnblogs.com/dolphin0520/p/3933551.html

转载于:https://www.cnblogs.com/mythdoraemon/p/10214435.html

你可能感兴趣的文章
iOS并发编程笔记【转】
查看>>
08号团队-团队任务5:项目总结会
查看>>
SQL2005 删除空白行null
查看>>
mysql备份与恢复
查看>>
混沌分形之迭代函数系统(IFS)
查看>>
边框圆角Css
查看>>
使用Busybox制作根文件系统
查看>>
jpg图片在IE6、IE7和IE8下不显示解决办法
查看>>
delphi之模糊找图
查看>>
Javascript模块化编程的写法
查看>>
大华门禁SDK二次开发(二)-SignalR应用
查看>>
oracle 使用job定时自动重置sequence
查看>>
集成百度推送
查看>>
在项目中加入其他样式
查看>>
在使用Kettle的集群排序中 Carte的设定——(基于Windows)
查看>>
【原】iOS中KVC和KVO的区别
查看>>
OMAPL138学习----DSPLINK DEMO解析之SCALE
查看>>
IoC的基本概念
查看>>
restframework CBV试图的4种方式
查看>>
大图居中,以1920px为例
查看>>