subList() 之后的 ConcurrentModificationException

ivo*_*lva 2 java unit-testing

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

执行后:

List<Card> cleanCards = cards.subList(0, cards.size() - difference);
Run Code Online (Sandbox Code Playgroud)

以下断言给了我一个 ConcurrentModificationException:

assertEquals(limit, cleanCards.size());
Run Code Online (Sandbox Code Playgroud)

错误描述

java.util.ConcurrentModificationException 
at java.util.ArrayList$SubList.size(ArrayList.java:1057)
Run Code Online (Sandbox Code Playgroud)

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

Leo*_*Aso 6

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

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

在您的情况下,“未定义”行为似乎导致抛出异常,也称为快速失败行为。我认为一个简单的解决方案是将上面的第一行更改为

List<Card> cleanCards = new ArrayList<>(cards.subList(0, cards.size() - difference));
Run Code Online (Sandbox Code Playgroud)

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