当前位置: 首页 > news >正文

关于报错java.util.ConcurrentModificationException: null的源码分析和解决

一般有这种问题,方法中至少会有List或者Map下的至少两个子类,有可能参数类型相同,也有可能不同都有可能触发这个问题!其主要原因是使用了ArrayList进行删除操作或者使用iterator遍历集合的同时对集合进行修改都有可能会出现这个问题
ArrayList属于List下的子类

需要区分的是List在java中有两个属于两个不同的包,这里说的是Util包下的List!两个类一个是接口一个是Class类(基础知识了吧算是)

在这里插入图片描述

针对此问题的ArrayList源码解析https://blog.csdn.net/qq_43705131/article/details/122607384

问题截图及源码触发部分代码
在这里插入图片描述
业务问题代码
在这里插入图片描述

不管泛型使用的是同种参数还是不同参数都要注意这个问题

场景复现

业务场景:

需要一个接口返回一个List对象,但是在List中需要调用另一个接口并将该接口的返回结果插入List中(如上图代码注释所写)

这时候类型的兼容性问题就出现了

代码场景:

首先:调用接口返回一个集合,需要集合中的全部数据及拿到集合中的ID
List<Map<String, List>> periodicLQ = periodicObservationMapper.periodicLQ(pointId,dir, lineNo, startDate, endDate);
用于调用另一个接口查询该ID下的全部值并且赋到一个List中用于返回

List structureDetailInfo = structureDetailInfoMapper.selectByPavementStructureInfoIds(ids);
代码实现:(问题复现)

这样写在List structureDetailInfo = structureDetailInfoMapper.selectByPavementStructureInfoIds(ids);

{//查询结构内     基本数据及  联合数据 ,返回统计结果     拿到structure_info 的 ID拿到结构数据将此以数组返回到VOList<Map<String, List<StructureDetailInfoPO>>> periodicLQ = periodicObservationMapper.periodicLQ(pointId,dir, lineNo, startDate, endDate);Map<String, List<StructureDetailInfoPO>> structureInfo = new HashMap<>();//用于存储接口获取到的所有id值List<Long> ids = new ArrayList<>();for (Map<String, List<StructureDetailInfoPO>> item: periodicLQ) {if (!item.isEmpty()){Long id = Long.valueOf(String.valueOf(item.get("id")));ids.add(id);for (int i = 0;i <= item.size();i++){List<StructureDetailInfoPO> structureDetailInfo = structureDetailInfoMapper.selectByPavementStructureInfoIds(ids);structureInfo.put("structureInfo",structureDetailInfo);//System.out.println(" structure detail info size : " + structureDetailInfo);//resultMap.add(structureInfo);}result.add(item);//result.add(structureInfo);//break;}System.out.println(" result size : " + result);}return result;}

解决方案–>避免修改ArrayList或者引用的其他List类和Map中的子类

创建一个名为 resultMap 的临时列表,并在循环中将结构信息添加到该列表中。最后,我们返回 resultMap 列表,而不是修改 result 列表用于返回。这就能够解决 ConcurrentModificationException 异常的问题,因为这样就创建了一个中间变量用来存储结果,避免修改了原来的result列表(List)


{//查询结构内     基本数据及  联合数据 ,返回统计结果     拿到structure_info 的 ID拿到结构数据将此以数组返回到VOList<Map<String, List<StructureDetailInfoPO>>> periodicLQ = periodicObservationMapper.periodicLQ(pointId,dir, lineNo, startDate, endDate);List<Map<String, List<StructureDetailInfoPO>>> resultMap = new ArrayList<>();Map<String, List<StructureDetailInfoPO>> structureInfo = new HashMap<>();//用于存储接口获取到的所有id值List<Long> ids = new ArrayList<>();for (Map<String, List<StructureDetailInfoPO>> item: periodicLQ) {if (!item.isEmpty()){Long id = Long.valueOf(String.valueOf(item.get("id")));ids.add(id);for (int i = 0;i <= item.size();i++){if (i == item.size()){List<StructureDetailInfoPO> structureDetailInfo = structureDetailInfoMapper.selectByPavementStructureInfoIds(ids);structureInfo.put("structureInfo",structureDetailInfo);//System.out.println(" structure detail info size : " + structureDetailInfo);}else {continue;}//resultMap.add(structureInfo);}resultMap.add(item);resultMap.add(structureInfo);//break;}System.out.println(" result size : " + resultMap);}return resultMap;}

:w最后总结:
代码中有
Long id = Long.valueOf(String.valueOf(item.get(“id”)));

在写这个的时候,一开始用了toString,编译不报错但运行有错,也建议大家使用这种包围的方法取代.***的方法(这种问题一定会随着jdk的不断更新有所改正)

此外在对断点进行一步步跟踪到源代码时发现的问题触代码如下

如图所示我们在读过SQLsession等常规源码后发现代码执行到了此类中,并确认了SQL是否执行正确
在这里插入图片描述
在左下角即为控制程序执行的断点按钮,可以手动点击||,这样resume按钮就会变绿变亮

在这里插入图片描述

问题触发代码:↓↓↓
在这里插入图片描述

http://www.lryc.cn/news/210058.html

相关文章:

  • 使用koa搭建服务器(一)
  • echarts的柱状图的重叠和堆叠实现两个柱体的显示和之前的差值显示
  • 泛积木-低代码 使用攻略
  • 红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写
  • 机器学习(五)如何理解机器学习三要素
  • 【计算机视觉】3D视觉
  • 策略路由和路由策略
  • [动态规划] (一) LeetCode 1137.第N个泰波那契数
  • SystemVerilog语法中,在Class中引用层次化信号
  • 磁盘的结构(磁道,扇区,盘面,柱面,物理地址)
  • uni-app集成uni-simple-router,报错:Uncaught ReferenceError: ROUTES is not defined
  • 几个常用的nosql数据库的操作方式
  • 如何使用 nvm-windows 这个工具来管理你电脑上的Node.js版本
  • 公司电脑禁用U盘的方法
  • Elasticsearch 7.X版本常用语法语句
  • Python分享之数学与随机数 (math包,random包)
  • Linux 基本语句_8_C语言_文件控制
  • 博通BCM575系列 RDMA 网卡驱动 bnxt_re 分析(一)
  • ExcelPatternTool 开箱即用的Excel工具包现已发布!
  • Navicat for MySQL 视图创建使用方法
  • 计算机视觉的相机选型
  • 实体店做商城小程序如何
  • sql-50练习题0-5
  • Flutter框架实现登录注册功能,不连接数据库
  • 持续集成部署-k8s-部署利器-Helm
  • 替换所有的问号
  • NCCL后端
  • 【API篇】十、生成Flink水位线
  • 【Javascript】弹出框
  • NSS [鹤城杯 2021]EasyP