You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何在指定索引添加元素?遇ConcurrentModificationException问题

解决Kotlin遍历列表时修改引发的ConcurrentModificationException问题

嘿,作为Kotlin新手碰到这个问题太正常啦!你遇到的ConcurrentModificationException,是因为你在遍历列表的同时直接修改了列表的结构,这是集合迭代时的典型“踩坑点”。

为什么你的代码会报错?

你用for (record in recordList)循环遍历列表时,底层是通过迭代器(Iterator)实现的。迭代器有个保护机制:当它在遍历过程中检测到集合被结构性修改(比如add、remove这类操作),就会抛出这个异常——因为它没法保证后续遍历的正确性了。你的代码正好踩了这个雷:在循环内部调用了recordList.add(index, updatedHeader),直接修改了列表结构。

修正后的解决方案

我们可以先找到目标元素的索引,等遍历结束后再修改列表,这样就不会触发并发修改检查了。

如果你想在匹配元素的位置插入新元素(和你原代码逻辑一致):

// 先找到第一个匹配id的元素索引
val targetIndex = recordList.indexOfFirst { it.id == updatedHeader?.id }
// 确保找到有效索引,且updatedHeader不为null
if (targetIndex != -1 && updatedHeader != null) {
    recordList.add(targetIndex, updatedHeader)
}

如果你其实是想替换原来的元素(而非插入):

如果你的需求是用updatedHeader替换掉匹配的元素,那应该用set方法而非add:

val targetIndex = recordList.indexOfFirst { it.id == updatedHeader?.id }
if (targetIndex != -1 && updatedHeader != null) {
    recordList[targetIndex] = updatedHeader
}

额外小提示

如果以后需要批量修改列表元素,建议先创建一个新列表,或者使用listIterator()的安全操作(比如它的set方法),避免在遍历原列表时直接修改它。

内容的提问来源于stack exchange,提问作者user8882642

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:27:15