我有一个列表,表示要从我的数据库中选择的一组字段。我将它传递给我用来构建一个select语句字符串的类。在构建它时,每当我检查列表#isEmpty时,我都会收到ConcurrentModificationException。我将其更改为ImmutableList,我不再遇到此问题。
然而,这让我很困惑......难道我不能在同时修改它的地方得到UnsupportedOperationException吗?
抛出异常的行:
if (list.isEmpty() || ... null checks) { ... }
例外:
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231)
at java.util.ArrayList$SubList.size(ArrayList.java:1040)
at java.util.AbstractCollection.isEmpty(AbstractCollection.java:86)
解决方案:
我正在检查#isEmpty的列表是一个子列表。创建子列表后编辑主列表(添加一些必填字段)。检查#isEmpty时,这会导致ConcurrentModificationException。 感谢。
答案 0 :(得分:1)
isEmpty()
不应该抛出ConcurrentModificationException
。只有在Iterator被修改时才会抛出(仅适用于某些集合)
如果自定义List实现抛出此异常,那么这不是预期的行为,所以当你包装它时,我希望它不再这样做。
我将其更改为ImmutableList,我不再遇到此问题。
这很可能是复制而不是包装您的列表,这是您可能看不到此异常的另一个原因。 (因为你使用的是副本而不是变异的原件)
我怎么可能得到我的堆栈跟踪。
我会称这是一个错误,或者至少是糟糕的设计。它没有记录,似乎也没有理由。
您可以获取subList()的副本,而不是取subList()
,这是我怀疑您正在做的事情。