使用iterator.remove()时的illegalStateException

时间:2013-06-20 20:28:49

标签: java

我遇到了导致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();
            }

        }
    }

2 个答案:

答案 0 :(得分:4)

以下行似乎是罪魁祸首:

dependencyTable.remove(depEntry); 

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

以下应该足够了:

  depIterator.remove(); 

答案 1 :(得分:0)

当循环数据结构并同时添加或删除该数据结构的内容时,您可能会遇到问题。如果你想在迭代列表时从列表中删除项目,我建议你跟踪你要删除的内容,然后在完成循环后将其全部删除。特别关注你的代码,我会保留这一行

dependencyTable.remove(depEntry);

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