使用 Iterator<Node> 时出现 ConcurrentModificationException

ConcurrentModificationException while using Iterator<Node>

我试图用 JavaFX 矩形删除 JavaFX GridPane 的,我发现没有办法这样做,但将上面的方块复制到下面的一行。这是我执行此操作的代码,但它一直抛出 ConcurrentModificationAcception.

static void copyAbove(int rowToBeDisappear, GridPane mainGrid) {
        for (int y = (rowToBeDisappear-1); 0 <= y ; y--) {
            for (int x = 0; x <= 9; x++) {
                Iterator<Node> iterator = mainGrid.getChildren().iterator();
                while (iterator.hasNext()) {
                    Node sqr = iterator.next();
                    if (sqr == getSqrByIndex(x,y,mainGrid)) {
                        iterator.remove();
                        mainGrid.add(sqr,x,(y+1));
                    }
                }
            }
        }
    }

错误

Caused by: java.util.ConcurrentModificationException at com.sun.javafx.collections.VetoableListDecorator$VetoableIteratorDecorator.checkForComodification(VetoableListDecorator.java:714) at com.sun.javafx.collections.VetoableListDecorator$VetoableIteratorDecorator.hasNext(VetoableListDecorator.java:682) at Main.copyAbove(Main.java:%local_code_row_nvm_this%)

感谢@Slaw 指出我的解决方案中的缺陷。

您不能同时迭代迭代器和修改其后备集合(通过该迭代器的 remove 方法除外)。将您希望对集合所做的任何结构更改存储到临时集合,然后在迭代后执行它们。

如果给定 xy,保证 getSqrByIndex() 最多 return 一个 Node,则以下代码不会导致 CME :

Node node = null;

Iterator<Node> iterator = mainGrid.getChildren().iterator();
while (iterator.hasNext()) {
    Node sqr = iterator.next();
    if (sqr == getSqrByIndex(x,y,mainGrid)) {
        node = sqr;
    }
}

if (node != null) {
    mainGrid.getChildren().remove(node);
    mainGrid.add(node, x, y + 1);
}

我完全是个白痴,而且是新手,所以这可能是错误的,但为什么不使用 for() 循环而不是 while()?我相信它将它保留在范围内,以便您可以调用 iterater.remove()。 此外,它可能会抛出该错误,因为您在迭代的同时将对象添加到迭代器中。我会尝试将添加和删除对象的点分开。