首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentModificationException在subList()之后

ConcurrentModificationException在subList()之后
EN

Stack Overflow用户
提问于 2017-12-19 16:16:17
回答 1查看 989关注 0票数 3

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

执行后:

代码语言:javascript
复制
List<Card> cleanCards = cards.subList(0, cards.size() - difference);

下面的断言给了我一个ConcurrentModificationException:

代码语言:javascript
复制
assertEquals(limit, cleanCards.size());

错误描述

代码语言:javascript
复制
java.util.ConcurrentModificationException 
at java.util.ArrayList$SubList.size(ArrayList.java:1057)

据我所知,'size()‘方法不会对列表进行结构更改。我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-19 16:25:23

最有可能的是,原始列表是在子列表创建和使用之间进行修改的。subList不创建独立的新列表,而是创建原始列表的一个部分的视图,就像规格所说的

如果支持列表(即此列表)在结构上被修改,而不是通过返回的列表,则此方法返回的列表的语义将变得不明确。(结构修改是那些改变列表大小的修改,或者以其他方式干扰它,以致正在进行的迭代可能产生不正确的结果。)

在您的例子中,“未定义的”行为似乎会导致抛出一个异常,也就是所谓的快速失败行为。我认为一个简单的解决方案是将上面的第一行改为

代码语言:javascript
复制
List<Card> cleanCards = new ArrayList<>(cards.subList(0, cards.size() - difference));

它将子列表复制到一个与原始列表无关的全新列表中。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47890998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档