我遇到了导致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();
}
}
}
答案 0 :(得分:4)
以下行似乎是罪魁祸首:
dependencyTable.remove(depEntry);
迭代时不要在数据结构上添加/删除(这会导致IllegalStateException
)。
以下应该足够了:
depIterator.remove();
答案 1 :(得分:0)
当循环数据结构并同时添加或删除该数据结构的内容时,您可能会遇到问题。如果你想在迭代列表时从列表中删除项目,我建议你跟踪你要删除的内容,然后在完成循环后将其全部删除。特别关注你的代码,我会保留这一行
dependencyTable.remove(depEntry);
并取出修改迭代器的代码行