欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java.util.ConcurrentModificationException

程序员文章站 2022-03-16 19:13:04
...

有这么一段代码:

for (QuestionMainModel questionMainModel : questionMainModels) {
    if (detailEntity.getQuestionMainId().equals(questionMainModel.getId())) {
           questionMainModel.setScore(getItemScore);
           questionMainList.add(questionMainModel);//加入已抽题list
           questionCount--;//需要抽题的个数减一
           questionMainModels.remove(questionMainModel);//从可选抽题list中去除,避免抽出的题目重复.
    }
}

这段代码执行的时候会有概率的报如标题一般的错误:

java.util.ConcurrentModificationException

这究竟是什么原因呢?

我们可以看到,我们在通过for遍历questionMainModels这个集合的时候,在里面可能会经过判断去直接操作questionMainModels中的元素进行添加或者删除操作,导致遍历集合的对象不稳定性。

我的猜测:

在我们执行for的时候,会预先把集合中的元素地址放在一个临时内存中,然后我们每遍历一个元素就会在其中拿一个元素的地址去访问,一旦我们删除其中的元素,或者让元素的排序不同之后,我们就通过地址取不到应得的元素了,从而导致报错。

网上的一篇相似情况的博客:

https://www.cnblogs.com/snowater/p/8024776.html

总之,我们在遍历集合的时候,尽量不要对集合进行增删的操作,所以上述代码修改如下:

List<QuestionMainModel> questionMainModels = mainMap.get(key);
List<QuestionMainModel> delQuestionMainModel=new ArrayList<>();
for (QuestionMainModel questionMainModel : questionMainModels) {
    if (detailEntity.getQuestionMainId().equals(questionMainModel.getId())) {
       questionMainModel.setScore(getItemScore);
       questionMainList.add(questionMainModel);//加入已抽题list
       questionCount--;//需要抽题的个数减一
       //questionMainModels.remove(questionMainModel);//从可选抽题list中去除,避免抽出的题目重复.
       delQuestionMainModel.add(questionMainModel);
    }
}
for (QuestionMainModel questionMainModel : delQuestionMainModel) {
    questionMainModels.remove(questionMainModel);
}

相关标签: for

上一篇: GLSL-帧缓冲FBO

下一篇: TWEEN动画