当我运行以下代码时,我得到一个例外,我不知道为什么。
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at simulateur.Simulateur.main(Simulateur.java:218)
第218行用于: for(Request r:Sys.queue),Sys.queue是一个ArrayList
//*************** DispatchRequest ***************
if(!Sys.queue.isEmpty())
{
algo = new SortingAlgo(Sys.queue, clock);
Sys.queue = algo.sorted_queue;
for(Request r : Sys.queue)
{
{
for(Porter p : p_i.porList)
{
if(p.p_state.equals("Available"))
{
...
...
Sys.queue.remove(r);
}
}
}
}
}
答案 0 :(得分:2)
在这部分代码中:
for(Request r : Sys.queue)
{
{
for(Porter p : p_i.porList)
{
if(p.p_state.equals("Available"))
{
...
...
Sys.queue.remove(r);
}
}
}
}
您的for
循环正在迭代Sys.queue
的元素,同时通过调用Sys.queue.remove(r);
您可以通过跟踪要在单独的列表/队列中删除的元素,然后使用ArrayList
removeAll(...)
方法来解决此问题。
例如:
for(Request r : Sys.queue)
{
{
for(Porter p : p_i.porList)
{
if(p.p_state.equals("Available"))
{
...
...
itemsToRemove.add(r);
}
}
}
}
Sys.queue.removeAll(itemsToRemove);
答案 1 :(得分:1)
您在迭代它时不允许从EventArgs
中删除。但是,您可以使用sender
方法直接从迭代器本身删除。
用于迭代ArrayList
的增强for循环不会公开迭代器,但如果将其更改为旧式for循环,则可以访问remove方法:
Iterator.remove()
答案 2 :(得分:0)
请查看ConcurrentModificationException以获取有关此异常发生原因的详细说明。在您的情况下,您在尝试更改它时迭代数组。如javadoc所述。
此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出一个ConcurrentModificationException。
您要么想要将要删除的所有元素收集到列表中,然后在最后执行removeAll(),要么将您不想删除的所有元素放入另一个列表中。清除此列表。