线程“main”java.util.ConcurrentModificationException中出现异常

时间:2016-02-07 12:06:32

标签: java collections

我知道有很多与此例外有关的问题。即使我在Getting ConcurrentException when working with list之前也问过这个问题,解决方案是使用ListIterator而不是迭代器。在我的下面的程序中,我使用了ListIterator,但我仍然遇到了这个例外。

我真的无法理解为什么会遇到此异常。任何人都可以帮我解决这个问题吗?

  public static void main(String args[]) {
    List<String> myList = new ArrayList<String>();
    myList.add("1");
    myList.add("2");
    myList.add("3");
    myList.add("4");
    myList.add("5");

    List<String> myList_1 = new ArrayList<String>();
    myList_1.add("4");
    myList_1.add("6");


    ListIterator<String> it = myList.listIterator();

    mainLoop:
      while(it.hasNext()) {
        String internalAperture = it.next();
        System.out.println("Aperture:"+internalAperture);
        String refreneceNumber = internalAperture;
        if (refreneceNumber.equals("6")) {

          myList.add("6");
          break;
        }
        else {
          ListIterator<String> it_ = myList_1.listIterator();
          while(it_.hasNext()) {
            String a = it_.next();         
            myList.add(a);
            continue mainLoop;
          }
        }
      }
  }

2 个答案:

答案 0 :(得分:0)

您得到异常,因为您在迭代时修改了列表。

迭代器允许您这样做的唯一方法是通过迭代器修改列表

ListIterator仅允许在其当前位置之后add元素。您无法添加到列表的末尾。我不知道这对你的算法是否有问题。如果必须添加到最后,请考虑使用for (int i=0; i<list.size(); i++)循环(这样可以提供更多控制权)。

答案 1 :(得分:0)

如果您想在浏览列表时修改列表,可以使用CopyOnWriteArrayList代替List

CopyOnWriteArrayList<String> myList = new CopyOnWriteArrayList<String>();

在其他情况下,您可以忘记迭代器并使用通常的循环:

for (int i = 0; i < myList.size(); i++) {                
  String internalAperture = myList.get(i);
  //do something
}