java.util.ConcurrentModificationException: null异常

创作背景:在加强for循环中使用了remove操作

原因:

在官方文档中ConcurrentModificationException的介绍如下:

public class ConcurrentModificationException extends RuntimeException

某个线程在 Collection 上进行遍历时,通常不允许其他线程修改该 Collection,这会导致遍历的结果是不确定的。当方法检测到集合发生并发修改时,不允许这种修改,抛出此异常。

在执行增删操作以后,集合的expectedModCount和modCount的值不一致,这两个变量的作用都是记录修改次数的,二者不相等,就会抛错。

expectedModCount:表示对ArrayList修改次数的期望值,它的初始值为modCount。

modCount是AbstractList类中的一个成员变量。

先说解决方法:

使用增强for循环遍历,增删操作使用迭代器实现。原因我们后面说,没空看的直接看到测试代码就可以了,先把工作解决了。

实战代码实现:

//先保证两个集合有值,LinkedList可以,这里省略赋值步骤

LinkedList<PlayAudioEntity> audioList = new LinkedList<>();

LinkedList<PlayAudioEntity> resultList = new LinkedList<>();

//入栈,redis有数据则需要比较是否有相同专辑下同一作品,有则放入队头

        for (PlayAudioEntity entity : audioList) {

            if (!CollectionUtils.isEmpty(resultList)) {

                String audioId = entity.getAudioId();


                //使用迭代器删除数据

                Iterator<PlayAudioEntity> it = resultList.iterator();

                while (it.hasNext()) {

                    PlayAudioEntity entity2 = it.next();

                    String audioId2 = entity2.getAudioId();

                    if (audioId2.equals(audioId)) {

                        it.remove();

                    }

                }

            }


            resultList.push(entity);

        }

看不懂的看这里,测试代码和结果:

public static void main(String[] args) {

    //赋值

    LinkedList<TestDO> resultList = new LinkedList<>();

    TestDO testDO1 = new TestDO();

    testDO1.setId(1);

    testDO1.setName("名字1");

    TestDO testDO2 = new TestDO();

    testDO2.setId(2);

    testDO2.setName("名字2");

    TestDO testDO3 = new TestDO();

    testDO3.setId(3);

    testDO3.setName("名字3");

    TestDO testDO4 = new TestDO();

    TestDO testDO5 = new TestDO();

    testDO4.setId(4);

    testDO4.setName("名字4");

    testDO5.setId(5);

    testDO5.setName("名字5");

    resultList.add(testDO1);

    resultList.add(testDO2);

    resultList.add(testDO3);

    resultList.add(testDO4);

    resultList.add(testDO5);

    //LinkedList<TestDO> resultList2 = resultList;

    //resultList.removeIf(a-> a.getId()==2);

    System.out.println("resultList:" + resultList);

    //System.out.println("resultList2:" + resultList2);

    System.out.println("完毕");

    //使用迭代器删除数据

    /*Iterator<TestDO> it = resultList.iterator();

    while (it.hasNext()) {

        TestDO entity2 = it.next();

        Integer audioId2 = entity2.getId();

        if (audioId2 == 2) {

            it.remove();

        }

    }

    System.out.println("resultList:" + resultList);*/

    //使用普通for循环删除数据

    /*for (int i = 0; i < resultList2.size(); i++) {

        TestDO testDO = resultList2.get(i);

        Integer id = testDO.getId();

        if (id == 3) {

            resultList2.remove(testDO);

        }

    }*/

  // System.out.println("resultList:" + resultList2);

}

1.迭代器


2.stream


3.还有一种网上方法叫使用索引(普通for循环)遍历。用了用,结果是只能是ArrayList才可以使用。普通for循环删除元素存在一个问题,那就是remove操作会改变List中元素的下标,可能存在漏删的情况。所以建议使用迭代器删除。


有时间的话会在研究下问什么不允许加强for循环删除的,懂得大佬也可以在下面评论指正。

创作不易,如果这篇文章对你有用,请点赞。有其他建议请在下方留言评论,谢谢♪(・ω・)ノ!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 学习集合之前复习相关知识: Hash:翻译为散列、哈希,所以散列和哈希指的是同一个概念。散列码:一种标识码,由散列...
    教堂白鸽阅读 236评论 0 1
  • 集合和数组的区别 数组:定长的 可以存放相同类型的数据 数据可以是基本类型也可以是引用类型 访问速度比较快 集合:...
    A建飞_dedf阅读 212评论 0 0
  • 一、Collection集合 1.1集合体系结构【记忆】 集合类的特点​ 提供一种存储空间可变的存储模型,存储的数...
    super_hongtao阅读 300评论 0 0
  • 前言 多年以前自学Java,在本地做了一些笔记。最近几年流行播客,一方面防止丢失,一方面可以帮助其他小伙伴...
    chaohx阅读 1,033评论 0 3
  • 请使用LinkedList来模拟一个队列(先进先出的特性): 拥有放入对象的方法void put(Object o...
    辽A丶孙悟空阅读 1,151评论 0 17