[英]ConcurrentModificationException thrown by crop(x) and a.setFrom()
我目前迷失在那個問題中。 我在這里閱讀了很多關於 ConcurrentModificationException 的其他問題,但無法解決我的問題。 也許我只見樹木不見森林。 我希望你能幫助我。 方法是
public void crop(PesNode n) {
for (int ii = n.getPostNodes().size()-1; ii >= 0; ii--) {
for (int i = ii-1; i >= 0; i--) {
PesNode n1=n.getPostNodes().get(i);
PesNode n2=n.getPostNodes().get(ii);
if (n1.getName().equals(n2.getName())) {
boolean merge=true;
for (PesNode node : n1.getPreNodes()) {
if (!n2.getPreNodes().contains(node)) {
merge=false;
}
}
for (PesNode node : n2.getPreNodes()) {
if (!n1.getPreNodes().contains(node)) {
merge=false;
}
}
if (merge) {
//Merge n1 and n2
//for(Iterator<PesArc> itPesArc = n2.getPost().iterator(); itPesArc.hasNext();) { PesArc a = itPesArc.next();
for(PesArc a : n2.getPost()) {
a.setFrom(n1);
n1.getPost().add(a);
}
//for(Iterator<PesArc> itPesArc = n2.getPost().iterator(); itPesArc.hasNext();) { PesArc a = itPesArc.next();
for(PesArc a : n2.getPre()) {
arcs.remove(a);
a.getFrom().getPost().remove(a);
}
//for(Iterator<Integer> it = n2.getCoset().iterator(); it.hasNext();) { int j = it.next();
for (int j : n2.getCoset()) {
if (!n1.getCoset().contains(j)) {
n1.getCoset().add(j);
}
}
nodes.remove(n2);
//n2.getPost().removeIf(Objects::isNull);
//n2.getPre().removeIf(Objects::isNull);
//n2.getCoset().removeIf(Objects::isNull);
i=0;
}
}
}
}
for (PesNode x : n.getPostNodes()) {
crop(x);
}
錯誤來自末尾的“crop(x)”,並在“a.setFrom(n1);”處彈出我不明白為什么會這樣,因為每個 for 循環都會在下一個循環開始之前結束。 我還嘗試使用迭代器而不是 for 循環,但沒有任何解決方案。 我做錯了什么?
您得到ConcurrentModificationException
因為您在使用for
運算符時嘗試刪除元素。 所以我認為你的代碼中的行nodes.remove(n2);
會導致這個異常。 您可以使用 Iterator 或只是收集要在另一個 Collection 中刪除的元素,然后將其刪除。 更多信息: https://www.baeldung.com/java-concurrentmodificationexception
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.