2017-06-14 26 views
1

我試圖做一些caluclation在主線程列表中的每個值,如下ConcurrentModificationException的名單上的大小()

for (int i = 0; i < list.size(); i++) { 
       //Do some task 
      } 

柏迪我得到的則爲list.size的ConcurrentModificationException的()。

它是簡單的java.util.List

Caused by: java.util.ConcurrentModificationException 
                     at java.util.AbstractList$SubAbstractList.size(AbstractList.java:360) 
                     at java.util.Collections$SynchronizedCollection.size(Collections.java:440) 

如何解決這個問題?

完整代碼:

private List<Double> computeValue(@NonNull List<Double> list1, List<Double> list2) { 
     List<Double> computedList = new ArrayList<>(); 
      for (int i = 0; i < list1.size(); i++) { 
       computedList.add(-((list1.get(i) + list2.get(i))/2)); 
      } 
     return computedList; 
    } 
+0

您是否正在刪除列表中的元素,而你正在迭代呢?請顯示「//執行某項任務」中的代碼。 – hamena314

+0

@ hamena314請檢查編輯,我已經添加了完整的代碼,並沒有更改值。 – Praveen

+0

我不知道「List」的實現會拋出CME的大小,因爲這不是迭代的一部分。你確定它在那裏發生?列表的具體類型是什麼? –

回答

0

使用ListIterator解決ConcurrentModificationException。在ListIterator中,您可以在迭代時添加。

如:

List<Double> list = new ArrayList<>(); 
    list.add(2d); 
    list.add(3d); 
    list.add(4d); 
    ListIterator iterator = list.listIterator(); 
    while (iterator.hasNext()){ 
    double val = (double) iterator.next(); 
    iterator.add(val + val/2); 
    } 
    System.out.println(list); 

出把

[2.0, 3.0, 3.0, 4.5, 4.0, 6.0] 
0

我不知道是什麼問題,但它是由外部檢查的大小循環解決。無論如何感謝您的回覆

int listSize = list.size();  
for (int i = 0; i < listSize; i++) { 
    //Do some task 
} 
+0

看着你的問題和你的答案,你似乎使用4個不同的列表,即'list','list1', 'list2','computedList'。在你問題的第一個版本中,你使用'list',在「完整代碼」中使用'list1'。在你的回答中你使用'list'。我認爲你正在使用縮寫代碼來顯示你的問題,但是有可能,你混淆了一些列表名稱並且只是發佈了錯誤的代碼?我只是好奇。 – hamena314

+0

@ hamena314我正在使用list1,list2和computedList。列表就是我給出的例子 – Praveen

相關問題