簡體   English   中英

crop(x) 和 a.setFrom() 拋出的 ConcurrentModificationException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM