在这里阅读了其他问题,我相信我会说对了,当您尝试在迭代节点时修改节点的子节点时,会发生此错误。
我看到了几种可以用来解决此问题的方法,但是当我弄乱我的代码时,我注意到通过用常规的for循环替换增强的for循环可以解决此问题。
我的第一个问题是为什么这样做有效?在我看来,在遍历节点的子节点时,我仍在对其进行修改,因此我不明白为什么现在可以这样做。 其次,以这种方式克服错误有什么问题吗?
更新
根据要求,以下是代码段
ArrayList<Button> list = new ArrayList<Button>();
Button b1 = new Button();
Button b2 = new Button();
Button b3 = new Button();
Collections.addAll(list, b1, b2, b3);
//Error
for(Button b : list) {
list.remove(b);
}
//No Error
for(int i = 0; i < list.size(); i++) {
Button b = list.get(i);
list.remove(b);
}
答案 0 :(得分:1)
从列表中删除元素的最佳方法是使用迭代器
请注意,Iterator.remove()是在迭代过程中修改集合的唯一安全方法。如果在迭代进行过程中以其他方式修改了基础集合,则行为不确定。
您可以在此stackoverflow thread
中找到更多内容答案 1 :(得分:0)
在第一个循环中,由于尝试修改当前正在遍历的集合而收到错误消息。
第二个之所以起作用,是因为您没有遍历集合,而是从集合中获取了一个项目,然后对其调用了remove。
检查以下内容:https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html