Java 8中线程“main”java.util.ConcurrentModificationException中的异常

时间:2016-09-20 01:56:17

标签: java arrays exception

当我运行以下代码时,我得到一个例外,我不知道为什么。

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);
                    }
                }
            }
        }
    }

3 个答案:

答案 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(),要么将您不想删除的所有元素放入另一个列表中。清除此列表。