JavaFx-ConcurrentModificationException

时间:2019-03-27 07:59:47

标签: java

在这里阅读了其他问题,我相信我会说对了,当您尝试在迭代节点时修改节点的子节点时,会发生此错误。

我看到了几种可以用来解决此问题的方法,但是当我弄乱我的代码时,我注意到通过用常规的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);
    }

2 个答案:

答案 0 :(得分:1)

从列表中删除元素的最佳方法是使用迭代器

  

请注意,Iterator.remove()是在迭代过程中修改集合的唯一安全方法。如果在迭代进行过程中以其他方式修改了基础集合,则行为不确定。

您可以在此stackoverflow thread

中找到更多内容

答案 1 :(得分:0)

在第一个循环中,由于尝试修改当前正在遍历的集合而收到错误消息。

第二个之所以起作用,是因为您没有遍历集合,而是从集合中获取了一个项目,然后对其调用了remove。

检查以下内容:https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html