subList()之后的ConcurrentModificationException

时间:2017-12-19 16:16:17

标签: java android unit-testing

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

执行后:

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)

据我所知,&#39; size()&#39;方法不会对列表进行结构更改。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:3)

最有可能在子列表创建及其使用之间修改原始列表。 subList不会创建一个独立的新列表,而是创建原始列表的一部分视图,并且specs

  

如果是,则此方法返回的列表的语义将变为未定义   支持列表(即,该列表)以任何方式在结构上被修改   除了通过返回的列表。 (结构修改是那些   这会改变这个列表的大小,或以其他方式扰乱它   方式,正在进行的迭代可能会产生不正确的结果。)

在你的情况下,&#34; undefined&#34;行为似乎导致抛出异常,也称为故障快速行为。我认为一个简单的解决方案是将上面的第一行更改为

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

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