2017-06-14 3 views
1

Ich versuche, einige caluclation für jeden Wert der Liste im Hauptthread wie untenConcurrentModificationException auf Listengröße()

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

Bur Ich erhalte die ConcurrentModificationException auf list.size() zu tun.

Es ist die einfache 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) 

Wie dieses Problem zu lösen?

komplette Code:

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

Löschen Sie Elemente in der Liste, während Sie darüber iterieren? Bitte zeigen Sie den Code, der in "// tue einige Aufgabe" kommt. – hamena314

+0

@ hamena314 Bitte überprüfen Sie die Bearbeitung, ich habe den vollständigen Code hinzugefügt und die Werte nicht geändert. – Praveen

+0

Ich bin mir einer Implementierung von 'List' nicht bewusst, die einen CME auf die Größe werfen würde, weil das nicht Teil einer Iteration ist. Bist du sicher, dass es dort vorkommt? Was sind die konkreten Arten der Listen? –

Antwort

0

Verwenden ListIterator, um die ConcurrentModificationException zu lösen. In ListIterator können Sie während der Iteration hinzufügen.

ZB:

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

heraus gesetzt

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

Ich bin nicht sicher, was das Problem war, aber es wird durch Überprüfen der Größe außerhalb der for-Schleife gelöst. Trotzdem danke für die Antwort

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

Mit Blick auf Ihre Frage und Ihre Antwort scheinen Sie 4 verschiedene Listen zu verwenden, nämlich 'list',' list1', 'list2',' berechneteListe'. In Ihrer ersten Version der Frage haben Sie 'list' verwendet, im" Complete code "verwenden Sie' list1'. In Ihrer Antwort verwenden Sie 'list'. Ich denke, Sie verwenden abgekürzten Code, um Ihr Problem zu zeigen, aber ist es möglich, dass Sie einige Listennamen verwechselten und einfach den falschen Code posteten? Ich bin nur Neugierig. – hamena314

+0

@ hamena314 Ich verwende list1, list2 und computedList. Liste ist das Beispiel, das ich angegeben habe – Praveen

Verwandte Themen