Вопрос по java, exception – Как исправить ошибку java.util.ConcurrentModificationException при попытке пройти в ArrayList

1

Я пытаюсь добавить новый объект в мой ArrayList, если он удовлетворяет условию. Но я получил это ConcurrentModificationExeption, когда я попытался запустить его. Надеюсь, вы могли бы помочь мне:

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

И здесь ошибка исключения

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at Diary.addTaskCollection(Diary.java:36)
at Test.main(Test.java:50)
Java Result: 1
stackoverflow.com/questions/8715322/… Balaswamy Vaddeman
Collections.copy (судьба, источник) Tiago Peczenyj

Ваш Ответ

5   ответов
0

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

Может быть, вы можете попробовать это: booleanificationReqd = false; for (Задача task: this.taskCollection) {if () {// проверить условие здесьificationReqd = true; перерыв; }} if (ificationReqd) {this.taskCollection.add (t); }
Попробуйте скопировать, используя Collections.copy (судьба, источник).
Я пытался закодироватьList<Task> tempCollection = this.taskCollection; ListIterator<Task> iterator = tempCollection.listIterator(); if(tempCollection.isEmpty()) taskCollection.add(t); while (iterator.hasNext()){ if(t.isOverlapped(iterator.next())) taskCollection.add(t); } но это не работает babygau
0

вы столкнулись с расой. Несколько потоков получают доступ к одной и той же коллекции. Используйте потокобезопасную реализацию List.

Кроме того, вы не должны изменять коллекцию (добавлять / удалять), когда выполняете ее итерацию.

EDIT

ConcurrentModificationExeption Похоже, что TaskCollection доступен и модифицируется несколькими потоками одновременно (мы не можем сказать, какой кусок кода вы предоставляете, если ваша программа является однопоточной или многопоточной). Если вы разделяете taskCollection между несколькими потоками, используйте поточно-ориентированную реализацию списка.

Но ошибка здесь на самом деле очевидна из-за того, что вы добавляете элемент в коллекцию между моментом, когда вы получаете на него итератор, и моментом, когда вы используете этот итератор. Чтобы исправить это, скопируйте новые элементы во временный список и добавьте их все сразу в конце итерации.

Это неправильно ... эта программа однопоточная.
Так, как я мог изменить вышеупомянутый arraylist, заботясь, чтобы просветить меня? babygau
Проблема только в том, что вы не можете изменить список, перебирая его с помощью итератора ... вот почему вы должны скопировать его и изменить копию.
Вы не знаете, что он многопоточный. Это вполне может быть однопоточным
Во-первых, у вас недостаточно информации, чтобы сказать, что программа однопоточная. В любом случае, мы все согласны с тем, что ошибка связана с итерацией / модификацией, и вы вправе указать, что мой пост был неясным. Так что я только что отредактировал это. Во-вторых, вот javadoc для ConcurrentModificationException: & quot; ... как правило, один поток не может изменять коллекцию, пока другой поток итерирует по ней. Как правило, результаты итерации в этих обстоятельствах не определены ... & quot;
0

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.

Да, и я попытался немного изменить ваш код, чтобы он был скомпилирован, но вывод неправильный. babygau
Это не работает, приятель & gt;. & Lt; babygau
Потому что ваш ответ довольно близок к моему вопросу, поэтому я буду отмечать вас как правильный ответ. babygau
Вы все еще получаете ConcurrentModificationException?
Я наконец-то понял все правильно, но у меня недостаточно прав, чтобы ответить на мой вопрос. Если возможно, пожалуйста, помогите мне изменить обновление вашего кода следующим образом: & lt; / br & gt;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); } babygau
0

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

Похожие вопросы