Kotlin 中的列表分配触发器 ConcurrentModificationException

List allocation trigger ConcurrentModificationException in Kotlin

提问人:Quentin 提问时间:8/1/2023 最后编辑:Quentin 更新时间:8/1/2023 访问量:28

问:

我有一个函数,它以列表为参数,目的是将此列表与对象中包含的另一个列表合并。

private fun joinListToUpdatedList(listToJoin: List<ExpirationDatesArt>?){

        val folderUpdatedListValue : MutableList<ExpirationDatesArt>? = folderUpdatedList.ExpirationDatesArt?.toMutableList()

        if(listToJoin != null){
            if(folderUpdatedListValue != null){

                folderUpdatedListValue.addAll(listToJoin)
                val joinedUpdatedList = folderUpdatedListValue.distinctBy { it.cdean }

                folderUpdatedList.ExpirationDatesArt = joinedUpdatedList
            }
            else{
                folderUpdatedList.ExpirationDatesArt = listToJoin
            }
        }
    }

当我第一次调用该函数时,我的对象列表为 null,因此它的值是使用 listToJoin 初始化的。

如果我再次调用该函数,无论是立即还是几秒钟后,folderUpdatedListValue 初始化都会崩溃并返回 ConcurrentModificationException 错误。

我不明白为什么,因为我没有删除一个项目,我只是试图访问我感兴趣的对象的列表。

我尝试将 listToJoin 上的 addAll 函数与 folderUpdatedListValue 一起使用,但结果是相同的。

如何使此函数被多次调用?

java android list kotlin concurrentmodificationexception

评论

0赞 Volzy 8/1/2023
我认为它在 distinctBy() 之后缺少一个 collect()。类型推断问题
1赞 Tenfour04 8/1/2023
问题是您必须迭代才能创建副本,因此此函数之外的代码中必须有其他位置在未完成迭代的情况下在其上打开迭代器。folderUpdatedList.ExpirationDatesArt
2赞 Tenfour04 8/1/2023
不相关,但 IMO 当参数为 null 时,函数为 no-op 是一种反模式。它应该只是使参数不可为空,并将其推送给调用方,使其仅在非 null 时调用,而不是函数静默地失败。此外,您的整个函数内容可以简化为folderUpdatedList.ExpirationDatesArt = (folderUpdatedList.ExpirationDatesArt.orEmpty() + listToJoin.orEmpty()).distinctBy { it.cdean }

答: 暂无答案