Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedList的ConcurrentModificationException_Java_Iterator_Linked List - Fatal编程技术网

Java LinkedList的ConcurrentModificationException

Java LinkedList的ConcurrentModificationException,java,iterator,linked-list,Java,Iterator,Linked List,我有一个对象的LinkedList和一个迭代器。我知道,当您在运行迭代器时尝试修改列表时,会引发ConcurrentModificationException。但在我的情况下,我不明白这种修改是在哪里进行的 迭代器如下所示: private static void insertTasks(Task t) { if(eventQueue.size() == 0) { eventQueue.addFirst(tsk); return; } i

我有一个对象的LinkedList和一个迭代器。我知道,当您在运行迭代器时尝试修改列表时,会引发ConcurrentModificationException。但在我的情况下,我不明白这种修改是在哪里进行的

迭代器如下所示:

private static void insertTasks(Task t) {
    if(eventQueue.size() == 0) {
        eventQueue.addFirst(tsk);
        return;
    }

    int pos = 0;
    while (itr.hasNext()){
   //The line below throws the exception

        if (t.getArrivalTime() <= itr.next().getArrivalTime() ) 
        {           
            break;
        }
        pos++;
    }
}
任务
对象中的
getArrivalTime
如下所示:

public float getArrivalTime() { return arrivalTime; }
我的问题是,我在哪里做这个修改?运行该迭代器的
while
循环没有进行任何修改。是吗


我遗漏了什么吗?

我想问题在于,
itr
是类中的一个静态字段,这就产生了问题,因为您在第二次调用
insertTasks()
时向
eventQueue
添加了一个元素


避免静态字段。。。让自己尽可能地害怕和避免它们:)。它们是邪恶的,而且非常不友好。

我认为问题在于
itr
是类中的一个静态字段,这就产生了问题,因为您在第二次调用
insertTasks()
时向
eventQueue
添加了一个元素


避免静态字段。。。让自己尽可能地害怕和避免它们:)。它们是邪恶的,而且非常不友好。

您是否从多个线程访问它?在迭代时,您是否可以在代码中其他地方的另一个线程中修改它?否。我只有一个
main
线程。您是否可以提供一个复制该问题的自包含示例?很可能您正在更改未提供的代码中的集合。顺便说一句,我将使用
double
而不是
float
,除非您有很好的理由这样做。您是否从多个线程访问它?在迭代时,您是否可以在代码中其他地方的另一个线程中修改它?否。我只有一个
main
线程。您是否可以提供一个复制该问题的自包含示例?很可能您正在更改未提供的代码中的集合。顺便说一句,除非您有很好的理由这样做,否则我将使用
double
而不是
float
。但是在对
insertTasks
的第二次调用中,
eventQueue
未被修改。因为
eventQueue
size()
在第一次调用后不是零。我也调试过了,你说得对。问题是,在第一次调用
insertTask()
时,您已经在其他地方从空列表创建了迭代器。现在您正在添加一个元素。@gaganbm您在第一次调用之前初始化了
itr
,因此第一次调用通过插入项使迭代器无效,第二次调用在尝试迭代后崩溃。但是在对
insertTasks
的第二次调用中,
eventQueue
未被修改。因为
eventQueue
size()
在第一次调用后不是零。我也调试过了,你说得对。问题是,在第一次调用
insertTask()
时,您已经在其他地方从空列表创建了迭代器。现在您正在添加一个元素。@gaganbm您在第一次调用之前初始化了
itr
,因此第一次调用通过插入项使迭代器无效,第二次调用在尝试迭代后崩溃。
public float getArrivalTime() { return arrivalTime; }