subList() 后出现 ConcurrentModificationException

3

我在单元测试中遇到了这个问题。

执行以下代码后:

List<Card> cleanCards = cards.subList(0, cards.size() - difference);

以下断言会导致 ConcurrentModificationException 异常:
assertEquals(limit, cleanCards.size());

错误描述

java.util.ConcurrentModificationException 
at java.util.ArrayList$SubList.size(ArrayList.java:1057)

据我所知,“size()”方法不会对列表进行结构性更改。这里有什么我没注意到的吗?
1个回答

7
很可能在创建子列表和使用子列表之间,原始列表已经被修改。`subList` 方法不会创建一个独立的新列表,而是创建了一个原始列表的一部分视图,正如规范所说:

如果通过除返回的列表外的其他方式结构性地修改了支持列表(即此列表),则由此方法返回的列表的语义将变为未定义。 (结构性修改是指更改此列表的大小或以使迭代产生不正确结果的方式干扰它的修改。)

在您的情况下,“未定义”行为似乎会导致抛出异常,也称为“快速失败行为”。我认为一个简单的解决方案是将上面的第一行改为:
List<Card> cleanCards = new ArrayList<>(cards.subList(0, cards.size() - difference));

这将复制子列表到一个完全独立于原始列表的新列表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接