并发ModificationException

时间:2014-12-18 19:02:01

标签: java

我有一段代码,我不知道为什么我会收到concurrentModificationException

import java.util.*;
import java.util.LinkedList;
import java.util.Scanner;
public class CreateList{
    List<Integer> nestedList;
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the Nested List");
        CreateList obj = new CreateList();
        System.out.println(obj.createNestedList(sc.next()));
    }
    public List<Integer> createNestedList(String str){
        List<Object> aux = new LinkedList<Object>();
        nestedList = new LinkedList<Integer>();
        for(int itr=0; itr<str.length();itr++){
            char c = str.charAt(itr);
            if(c != ']' && c != ',')
            aux.add(c);
            else if(c == ']'){
                Object o = aux.subList(aux.lastIndexOf('[')+1,aux.size());
                aux = aux.subList(0,aux.lastIndexOf('['));
                aux.add(o);// THIS LINE IS THROWING THE EXCEPTION
                System.out.println(o);
                System.out.println(aux);
            }
        }
        System.out.println(aux);
        return nestedList;
    }
}

除了主线程之外,没有使用此代码的线程。不知道我错过了什么

3 个答案:

答案 0 :(得分:3)

我认为问题在于使用子列表。具体来说

aux = aux.subList(0,aux.lastIndexOf('['));

然后是

aux.add(o);// THIS LINE IS THROWING THE EXCEPTION

这会更改子列表的大小与原始列表的大小。

子列表的javadoc说:

  

如果支持列表(即此列表)在结构上以除返回列表之外的任何方式进行修改,则此方法返回的列表的语义将变为未定义。 (结构修改是那些改变了这个列表的大小,或以其他方式扰乱它的方式,正在进行的迭代可能会产生不正确的结果。)

如果子列表的modcounts与原始列表不同,.subList()返回的子列表实例会抛出异常。

解决方案是使用子列表

中的元素创建一个新列表
aux = new LinkedList<>(aux.subList(0,aux.lastIndexOf('[')));

答案 1 :(得分:1)

您需要创建另一个列表,而不是获取子列表并向其添加子列表。

尝试这样的事情:

List<T> list = new LinkedList<T>(someList.subList(0,n));

答案 2 :(得分:1)

如果要在迭代时修改列表,则必须使用列表迭代器。

List<Object> aux = new LinkedList<Object>();
...
ListIterator<Object> listIterator = aux.listIterator();

// replace the for loop with while. just to make it easier, but can be done with for loop
while(listIterator.hasNext()) {
    ...
    listIterator.add(o);
    ...
}

如果用这个替换代码,它应该可以工作。