我有一段代码,我不知道为什么我会收到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;
}
}
除了主线程之外,没有使用此代码的线程。不知道我错过了什么
答案 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);
...
}
如果用这个替换代码,它应该可以工作。