2

我遇到了导致 IllegalStateException 的迭代器删除问题。错误发生在

depIterator.remove() 我不确定为什么会这样。任何帮助,将不胜感激。

List<Dependency> listofAllDependency = new ArrayList<Dependency>();

    while(!dependencyTable.isEmpty()){          
        //allValuesDependentsAreBuilt = false;
        Iterator<Entry<Dependency, List<Dependency>>> depIterator = dependencyTable.entrySet().iterator();

        while(depIterator.hasNext()){
            ArrayList<String> allValuesDependentsAreBuilt = new ArrayList<String>();

            Entry<Dependency, List<Dependency>> depEntry = depIterator.next();


            //If the key's values have no dependencies
            if(depEntry.getValue().size()==0){
                //System.out.println(depEntry.getKey());
                listofAllDependency.add(depEntry.getKey());
                dependencyTable.remove(depEntry); 
                depIterator.remove(); 
            }

            for(Dependency dep :depEntry.getValue()){

                if(!dependencyTable.containsKey(dep)){
                    allValuesDependentsAreBuilt.add("true"); 
                }else
                {
                    allValuesDependentsAreBuilt.add("false"); 
                }
            }

            if(!allValuesDependentsAreBuilt.contains("false")){ 

                listofAllDependency.add(depEntry.getKey());
                dependencyTable.remove(depEntry);
                depIterator.remove();
            }

        }
    }
4

2 回答 2

4

似乎以下行是罪魁祸首:

dependencyTable.remove(depEntry); 

迭代时不要在数据结构上添加/删除(这将导致IllegalStateException)。

以下应该足够了:

  depIterator.remove(); 
于 2013-06-20T20:32:05.713 回答
0

在循环数据结构并同时添加或删除该数据结构的内容时,您可能会遇到问题。如果您想在遍历列表时从列表中删除项目,我建议您跟踪要删除的内容,然后在完成循环后将其全部删除。具体查看您的代码,我会保留此行

dependencyTable.remove(depEntry);

并取出修改迭代器的代码行

于 2013-06-20T20:32:44.613 回答