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);
}
上一篇: GLSL-帧缓冲FBO
下一篇: TWEEN动画
推荐阅读
-
关于java List的remove方法导致的异常java.util.ConcurrentModificationException
-
java.util.ConcurrentModificationException详解
-
java.util.ConcurrentModificationException
-
Caused by: java.util.ConcurrentModificationException
-
java.util.ConcurrentModificationException
-
java.util.ConcurrentModificationException: null
-
解决--java.util.ConcurrentModificationException
-
java.util.ConcurrentModificationException 解决方法
-
今天碰到 java.util.ConcurrentModificationException 异常
-
今天碰到 java.util.ConcurrentModificationException 异常