我在单元测试中遇到了这个问题。
执行后:
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()'方法不会对列表进行结构更改。我在这里错过了什么吗?
很可能原始列表正在子列表创建及其使用之间进行修改。 subList
没有创建一个独立的新列表,而是一个原始列表的一部分的视图,并且正如specs所说的
如果支持列表(即,此列表)在结构上以除了返回列表之外的任何方式进行修改,则此方法返回的列表的语义将变为未定义。 (结构修改是那些改变了这个列表的大小,或以其他方式扰乱它的方式,正在进行的迭代可能会产生不正确的结果。)
在您的情况下,“未定义”行为似乎导致抛出异常,也称为失败快速行为。我认为一个简单的解决方案是将上面的第一行更改为
List<Card> cleanCards = new ArrayList<>(cards.subList(0, cards.size() - difference));
它将子列表复制到一个独立于原始列表的全新列表。