Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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
在ArrayList中尝试遍历时如何修复java.util.ConcurrentModificationException错误_Java_Exception - Fatal编程技术网

在ArrayList中尝试遍历时如何修复java.util.ConcurrentModificationException错误

在ArrayList中尝试遍历时如何修复java.util.ConcurrentModificationException错误,java,exception,Java,Exception,如果ArrayList满足条件,我将尝试向其添加新对象。 但当我尝试运行它时,它给了我这个ConcurrentModificationExection。希望你能帮助我: public void addTaskCollection(Task t){ ListIterator<Task> iterator = this.taskCollection.listIterator(); if(this.taskCollection.isEmpty()) thi

如果ArrayList满足条件,我将尝试向其添加新对象。 但当我尝试运行它时,它给了我这个ConcurrentModificationExection。希望你能帮助我:

public void addTaskCollection(Task t){ 
    ListIterator<Task> iterator = this.taskCollection.listIterator();
    if(this.taskCollection.isEmpty())
        this.taskCollection.add(t);
    while (iterator.hasNext()){
        if(t.isOverlapped(iterator.next()))
            this.taskCollection.add(t);
    }    
}

复制阵列并更改原始阵列。

您似乎遇到了竞争条件。多个线程正在访问/修改同一集合。使用线程安全列表实现

此外,在使用迭代器对集合进行迭代时,不能修改集合的添加/删除

编辑

ConcurrentModificationExeption听起来像taskCollection是由多个线程同时访问和修改的,如果您的程序是单线程或多线程的,我们不能说您提供的代码是什么。如果在多个线程之间共享taskCollection,请使用线程安全列表实现


但是,这里的错误实际上显然是由于在获得迭代器和使用该迭代器之间向集合添加元素。要解决这个问题,请复制临时列表中的新元素,并在迭代结束时一次性添加它们

将代码替换为:

ListIterator<Task> iterator = this.taskCollection.listIterator();
boolean marker = false;

if(taskCollection.isEmpty())
    this.taskCollection.add(t);
else {
   while (iterator.hasNext()) {
      if(iterator.next().isOverlapped(t) == false)
         marker = true;
   }
}

if (marker == true)
    taskCollection.add(t);

为了避免ConcurrentModificationException。

根据评论重新格式化了Truong的答案:

ListIterator<Task> iterator = this.taskCollection.listIterator();
boolean marker = false;

if(taskCollection.isEmpty())
  this.taskCollection.add(t);
else {
  while (iterator.hasNext()) {
    if(iterator.next().isOverlapped(t) == false)
      marker = true;
  }
  if (marker == true)
    taskCollection.add(t);
}

维护两个迭代器

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Example_v3 {

     public static void main(String[] args) {
          List<String> list = new ArrayList<String>();

          // Insert some sample values.
          list.add("Value1");
          list.add("Value2");
          list.add("Value3");

          // Get two iterators.
          Iterator<String> ite = list.iterator();
          Iterator<String> ite2 = list.iterator();

          // Point to the first object of the list and then, remove it.
          ite.next();
          ite.remove();

          /* The second iterator tries to remove the first object as well. The object does
           * not exist and thus, a ConcurrentModificationException is thrown. */
          ite2.next();
          ite2.remove();
     }
}

Collections.copydestiny,source尝试使用Collections.copydestiny,source进行复制。我尝试对列表tempCollection=this.taskCollection进行编码;ListIterator迭代器=tempCollection.ListIterator;iftempCollection.isEmpty taskCollection.addt;虽然iterator.hasNext{ift.isOverlappediterator.next taskCollection.addt;}但它不起作用,可能您可以尝试以下操作:boolean modificationReqd=false;forTask task:this.taskCollection{如果{//检查这里的条件modificationReqd=true;break;}如果modificationReqd{this.taskCollection.addt;}那么我如何修改上面的arraylist,请告诉我好吗?问题是,在使用迭代器对列表进行迭代时,无法修改列表。。。这就是为什么您必须复制它并修改副本。首先,您没有足够的输入来说明程序是单线程的。无论如何,我们都同意错误是由迭代/修改引起的,你是对的,我的帖子不清楚。所以我刚刚编辑了它。其次,这里是ConcurrentModificationException的javadoc:。。。通常不允许一个线程在另一个线程迭代集合时修改集合。通常,在这些情况下,迭代的结果是未定义的。。。您不知道它是多线程的。它很可能是单线程的,你也不知道它是单线程的,这就是我所说的。我为我可能想暗示问题不是由国际热核聚变实验堆造成的这一事实道歉。/modif。事情这令人困惑。但即使此错误已修复,ConcurrentModificationException仍然可能发生,这取决于taskCollection的访问方式。请看,出现这种异常的第一个原因是竞争条件,而单线程环境中的迭代/修改只排在第二位。您是否仍然得到ConcurrentModificationException?是,我试着修改一下你的代码,让它被编译,但是输出是不正确的。我最终得到了正确的结果,但是没有足够的权限来回答我的问题。如果可能,请帮助我将您的代码更新为我的代码,如下所示:ListIterator iterator=this.taskCollection.ListIterator;布尔标记=假;如果askcollection.isEmpty this.taskCollection.addt;else{while iterator.hasNext{ifiterator.next.isOverlappedt==false marker=true;}如果marker==true taskCollection.addt;}因为你的答案与我的问题非常接近,所以我会将你标记为正确答案。奇怪的是,如果你注意到我的代码没有修改ie正在迭代的集合。最有可能的是,在更改时,您以某种方式恢复了原始代码。我建议您在问题中再次发布最新代码,然后我可以更好地帮助您。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Example_v3 {

     public static void main(String[] args) {
          List<String> list = new ArrayList<String>();

          // Insert some sample values.
          list.add("Value1");
          list.add("Value2");
          list.add("Value3");

          // Get two iterators.
          Iterator<String> ite = list.iterator();
          Iterator<String> ite2 = list.iterator();

          // Point to the first object of the list and then, remove it.
          ite.next();
          ite.remove();

          /* The second iterator tries to remove the first object as well. The object does
           * not exist and thus, a ConcurrentModificationException is thrown. */
          ite2.next();
          ite2.remove();
     }
}