使用 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
方法除外)。将您希望对集合所做的任何结构更改存储到临时集合,然后在迭代后执行它们。
如果给定 x
和 y
,保证 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()。 此外,它可能会抛出该错误,因为您在迭代的同时将对象添加到迭代器中。我会尝试将添加和删除对象的点分开。
我试图用 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
方法除外)。将您希望对集合所做的任何结构更改存储到临时集合,然后在迭代后执行它们。
如果给定 x
和 y
,保证 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()。 此外,它可能会抛出该错误,因为您在迭代的同时将对象添加到迭代器中。我会尝试将添加和删除对象的点分开。