<分区>
如果我只想访问列表的一个元素,有人可以向我解释为什么我会收到 ConcurrentModificationException
吗?
我的印象是,ConcurrentModificationException
只有在一个线程遍历一个集合而另一个线程试图修改它时才会抛出。这不是我的情况。我只想获取列表中的一个元素。
这是重现我的问题的代码片段(请不要判断逻辑,我只是想重现问题):
private static void checkConcurrentModificationException(){
List<String> stringSpan = new ArrayList<String>();
List<List<String>> clausesStrings = new ArrayList<List<String>>();
List<String> testStringList = new ArrayList<String>();
for (int i = 0; i < 121; i++) {
testStringList.add("abc");
}
for (int i = 0; i < testStringList.size(); i++) {
stringSpan.clear();
if (i%2==0) {
if (i>3) {
for (int j = i+1; j < testStringList.size(); j++) {
if (j>i+4 || j>=testStringList.size()-1) {
stringSpan = testStringList.subList(i, j); //might be the problem
clausesStrings.add(stringSpan);
break;
}
}
}
}
}
System.out.println("Clause list size: "+clausesStrings.size());
System.out.println("First clause: "+clausesStrings.get(0));
}
我分析了说明,得出的结论是问题出在 stringSpan = testStringList.subList(i, j);
但我不太确定后面发生了什么以及为什么会失败.此外,我尝试将结果列表 clausesStrings
复制(没有引用)到一个新列表,但到目前为止没有成功。