关于为什么
的任何想法lines = newRemainingLines.size();
会抛出此异常吗?
lines
是我用来存储ArrayList大小的int
newRemainingLines();
我意识到这可能不足以给出明确的答案,但也许对寻找什么的解释会有所帮助。老实说,我不知道这段代码是如何同时修改这个int的。
int i = 0;
POLines.clear();
itemLines.clear();
lines = newLines.size();
//POLines should contain only lines not relating to items
while(!newLines.get(i).equals(ITEMSTART) && i < lines){
POLines.add(newLines.get(i));
i++;
}
List<String> newRemainingLines = newLines.subList(i + 1, lines);
newLines.clear();
i = 0;
lines = newRemainingLines.size();
//itemLines should contain lines only relating to items
while(!newRemainingLines.get(i).equals(POEND) && i < lines){
itemLines.add(newRemainingLines.get(i));
i++;
}
List<String> finalRemainingLines = newRemainingLines.subList(i + 1, lines);
i = 0;
lines = finalRemainingLines.size();
while(i < lines){
newLines.add(finalRemainingLines.get(i));
i++;
}
tempOrder = POF.createPurchaseOrder(POLines,itemLines);
_orders.add(tempOrder);
这出现在具有类似代码段的for循环内的if-else语句中。这是最后一个,但只有这一个抛出异常。
答案 0 :(得分:2)
subList
返回基础列表的视图。它不是副本。
引用javadoc:
返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然。
如果支持列表(即此列表)以除了返回列表之外的任何方式进行结构修改,则此方法返回的列表的语义将变为未定义。
语句newLines.clear()
在结构上修改了支持列表,因此后续调用newRemainingLines.size()
说 No-Can-Do!,又名ConcurrentModificationException
。
要创建副本,请使用:
List<String> finalRemainingLines = new ArrayList<>(newRemainingLines.subList(i + 1, lines));