2016-02-07 54 views
-3

我知道有很多与此异常相关的问题。即使我在Getting ConcurrentException when working with list之前也问过这个问题,并且解决方案是使用ListIterator而不是迭代器。在我的下面的程序中,我使用ListIterator,但我仍然得到了这个例外。线程“main”中出现异常java.util.ConcurrentModificationException

我真的不明白为什么我得到这个例外。任何人都可以帮我解决这个问题吗?

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; 
      } 
     } 
     } 
    } 
+4

我不不要以为你明白'ListIterator'是什么。你不应该有'myList.add(“6”);'。 [让'ListIterator'做到这一点](https://docs.oracle.com/javase/8/docs/api/java/util/ListIterator.html#add-E-)! – Tunaki

回答

0

由于在遍历列表时修改列表,因此会发生异常。

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

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

0

如果你想修改的列表,而穿越它,你可以使用CopyOnWriteArrayList代替List

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

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

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

嗯。使用'CopyOnWriteArrayList',迭代器不会获取列表中的附加内容。它将继续循环到原来的列表中。这可能或可能不是这里所需的算法(不确定)。 – Thilo

相关问题