不应该抛出ConcurrentModificationException

时间:2015-10-15 03:35:19

标签: java

关于为什么

的任何想法
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语句中。这是最后一个,但只有这一个抛出异常。

1 个答案:

答案 0 :(得分:2)

subList返回基础列表的视图。它不是副本。

引用javadoc

  

返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然。

     

如果支持列表(即此列表)以除了返回列表之外的任何方式进行结构修改,则此方法返回的列表的语义将变为未定义。

语句newLines.clear()在结构上修改了支持列表,因此后续调用newRemainingLines.size() No-Can-Do!,又名ConcurrentModificationException

要创建副本,请使用:

List<String> finalRemainingLines = new ArrayList<>(newRemainingLines.subList(i + 1, lines));