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

news2025/1/14 0:52:00

一般有这种问题,方法中至少会有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拿到结构数据将此以数组返回到VO
		List<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拿到结构数据将此以数组返回到VO
		List<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.coloradmin.cn/o/1131874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI小百科 - 什么是生成式AI中的提示语 “Prompt“

定义 "Prompt" 是指在生成式AI中用于指导模型生成输出的输入文本或问题。它是一种方法&#xff0c;通过提供特定的信息或指示&#xff0c;引导AI生成与所需任务相关的响应。 让我们用一个小学生可以理解的方式来解释提示语。想象一下&#xff0c;你是一名小学生&am…

深入剖析Java反射机制:解锁高级编程技巧,事半功倍

前言 在 Java中&#xff0c;反射机制&#xff08;Reflection&#xff09;非常重要&#xff0c;但对于很多开发者来说&#xff0c;这并不容易理解&#xff0c;甚至觉得有点神秘 目录 1. 简介 定义&#xff1a;Java语言中 一种 动态&#xff08;运行时&#xff09;访问、检测 …

docker安装minio作为图床服务

minio官网&#xff1a;MinIO | 高性能分布式存储&#xff0c;私有云存储 适用于AI的高性能分布式云存储&#xff0c;MinIO提供高性能、与S3 兼容的对象存储系统&#xff0c;让你自己能够构建自己的私有云储存服务。 MinIO原生支持 Kubernetes&#xff0c;它可用于每个独立的公…

迅为itop-3568开发板qt学习手册上新

基于RK3568的QT教程他来了~从C基础到QT编程实例再到项目实战&#xff0c;《iTOP-3568开发板QT学习手册》带你打通QT的任督二脉。 界面布局 3.5.1 水平布局 l Horizontal Layout&#xff1a;水平方向布局&#xff0c;组件自动在水平方向上分布 使用时先选中组件&#xff0…

外卖霸王餐系统 支持小程序,分站合作

它终于出来啦&#xff01;微客云分站终于正式发布&#xff01;&#xff01;&#x1f4e3;&#x1f4e3;&#x1f4e3; 先前的文章就已经预告过微客云要搞分站&#xff0c;很多小伙伴们一直在问老许分站什么时候出来&#xff0c;想加盟分站怎么做&#xff1f;有什么条件&#xf…

部署:端口映射相关问题

图片仅作示意用途 在很多现场部署环境里&#xff0c;网络管理是相对严格的&#xff0c;设备所在的子网如果需要和办公网所在的服务器通讯&#xff0c;需要通过专门的中间节点&#xff0c;一般还有严格的防火墙配置。此时&#xff0c;研发环境里&#xff0c;服务器与设备子网各…

【Python3】【力扣题】136. 只出现一次的数字

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;遍历列表元素&#xff0c;查看该元素在列表中共有多少个&#xff0c;返回个数为1的元素。 知识点&#xff1a;列表.count(...)&#xff1a;统计列表中某元素个数。 class Solution:def …

【实战项目】高并发内存池(下)

我们上篇文章&#xff08;高并发内存池&#xff08;上&#xff09;&#xff09;介绍了向高并发内存池申请资源的整个过程&#xff0c;本篇文章我们将会对申请后的空间资源释放的整个流程。同时也会对我们自己实现的内存池进行性能测试和优化。 文章目录 一、thread cache 回收资…

CentOS 7 安装和配置java环境

1 安装包准备 安装包可以通过下面地址进行版本选择安装&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8 2 正式开始安装 本次分享的安装方法直接通过编辑/etc/profile文件实现java的安装 2.1 新建安装包存放目录 mkdir /java cd /java/ 2.2 解压安…

Mac电脑窗口管理Magnet中文 for mac

Magnet是一款Mac窗口管理工具&#xff0c;它可以帮助用户轻松管理打开的窗口&#xff0c;提高多任务处理效率。以下是Magnet的一些主要特点和功能&#xff1a; 分屏模式支持&#xff1a;Magnet支持多种分屏模式&#xff0c;包括左/右/顶部/底部 1/2 分屏、左/中/右 1/3 分屏、…

分享一下怎么做一个投票小程序链接

在这个数字化时代&#xff0c;微信小程序已经成为了我们生活中不可或缺的一部分。而投票小程序链接&#xff0c;更是具有广泛的应用场景和巨大的市场潜力。本文将详细介绍如何制作一个投票小程序链接&#xff0c;帮助大家了解其意义、设计思路、实现方法、亮点突出以及如何推广…

【notion enhancer安装】一个强大的笔记软件,可以实现侧边目录的notion

官网地址&#xff1a; https://notion-enhancer.github.io/getting-started/installation/ 介绍 众所周知&#xff0c;notion作为一款强大的笔记软件&#xff0c;深受广大uu的热爱。但是在使用普通版本的时候 &#xff0c;notion不能实现目录的侧边导航&#xff0c;对于很长的…

MyBatis Plus公共字段自动填充

MyBatis Plus公共字段自动填充&#xff0c;也就是在插入或者更新的时候为指定字段赋予指定的值&#xff0c;使用它的好处就是可以统一对这些字段进行处理&#xff0c;避免了重复代码。 例如&#xff0c;像每个table中都有createTime,createUser,updateTime,updateUser这些字段…

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)

数据算法 1310&#xff1a;【例2.2】车厢重组1176&#xff1a;谁考了第k名1177&#xff1a;奇数单增序列1178&#xff1a;成绩排序1179&#xff1a;奖学金1180&#xff1a;分数线划定1181&#xff1a;整数奇偶排序 1310&#xff1a;【例2.2】车厢重组 这道题简单&#xff0c;题…

黑马头条:app端文章查看

黑马头条&#xff1a;app端文章查看 黑马头条&#xff1a;app端文章查看文章列表加载1. 需求分析2. 表结构分析3. 导入文章数据库3.1 导入数据库3.2 导入对应的实体类 4. 实现思路5. 接口定义6. 功能实现6.1&#xff1a;导入heima-leadnews-article微服务&#xff0c;资料在当天…

无线通信的未来:WiFi HaLow的低功耗、超长距离革命

WiFi HaLow&#xff0c;一项创新性的Wi-Fi协议&#xff0c;致力于解决不断增长的物联网需求&#xff0c;兼具低功耗和超长距离覆盖的特点。建立在IEEE 802.11ah标准的基础上&#xff0c;WiFi HaLow为物联网开发者提供了全方位的无线解决方案&#xff0c;以满足他们对能源效率、…

Python报错:‘EagerTensor‘ object has no attribute ‘reshape‘

在使用RPython时&#xff0c;发现python代码部分报错&#xff1a;‘EagerTensor‘ object has no attribute ‘reshape‘ 如何解决&#xff1f; 使用np.array 转换为array&#xff0c;再进行reshape 参考&#xff1a; ‘EagerTensor‘ object has no attribute ‘reshape‘处…

由浅入深,详细总结 Spring 八种加载 Bean 的方式

文章目录 方式一&#xff1a;XML 方式声明 bean方式二&#xff1a;XML 注解方式声明 bean方式三&#xff1a;注解方式声明配置类扩展一&#xff1a;Bean 返回的对象和真实 Bean 对象可能不是一个扩展二&#xff1a;加载配置类的同时&#xff0c;加载配置文件&#xff08;系统迁…

堆体扫描点云体积计算实现思路分享

做了一个初步的 demo 实验&#xff0c; 计算一堆沙子或者煤堆这种物体的扫描点云的体积 思路就是分块计算每个小的立方体的体积&#xff0c;然后累加&#xff0c;wechat 394467238&#xff0c; 具体的实现细节略微麻烦一点&#xff0c;代码暂时不放了

C# 压缩图片

.net下跨平台图像处理 https://github.com/mono/SkiaSharp 安装包 skiasharp 效果 代码 ImageCompression.cs using SkiaSharp;namespace ImageCompressStu01 {/// <summary>/// 图片压缩/// </summary>public class ImageCompression{/// <summary>/…