簡體   English   中英

Java-具有遞歸方法和嵌套迭代器的ConcurrentModificationException

[英]Java - ConcurrentModificationException with recursive method and nested iterators

我分配了一個Java程序,該程序將在無上下文語法中讀取並返回所有非終端的FirstSet。 我使用FirstSet()方法采用了遞歸方法:

public static ArrayList<String> firstSet(String nonTerminal){
    ArrayList<String> first = new ArrayList<String>();
    //Find initial elements of FirstSet
    for(String[] current : prodRules) {
        if (current[0].equals(nonTerminal)){ //if the production rule is for that non-terminal
            if(current.length > 2) {
                first.add(current[2]);          //first element after "-->" is added to FirstSet
            } else
                first.add("eps");
        }
    }
    //Add the FirstSet of each element in the initial FirstSet
    ArrayList<String> copy = first; //to avoid ConcurrentModificationException
    Iterator<String> it1 = copy.iterator();
    while(it1.hasNext()) { //recursively find each FirstSet of the initial elements
        String s = it1.next();
        System.out.println("FIRST("+s+")={");
        ArrayList<String> nestedFS = firstSet(s);
        Iterator<String> it2 = nestedFS.iterator();
        while(it2.hasNext()) {
            String f = it2.next();
            if(!first.contains(f))
                first.add(f);
            System.out.print(" "+f+" ");
        }
        System.out.print("}");
    }
    return first;
}

但是,我不斷收到以下行的ConcurrentModificationException錯誤:

String s = it1.next();

ArrayList<String> nestedFS = firstSet(s);

據我所知,我沒有修改當前正在迭代的任何列表。 相反,我正在遍歷副本。 我不關心冗余內存的使用或速度,我只需要它即可工作。

關於我在這里做錯什么的任何線索嗎? 任何幫助深表感謝。

首先使用CopyOnWriteArrayList創建ArrayList的副本,這避免了ConcurrentModificationException。

    ArrayList<String> copy = first; //replace this line with 
    CopyOnWriteArrayList<String> copy= new CopyOnWriteArrayList<String>(first);

ArrayList不是線程安全的,需要實現線程安全,相反,我們可以使用具有線程安全性的CopyOnWriteArrayList。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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