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
相关产品推荐
相关产品推荐

