List.addAll()什么时候抛出IllegalStateException?

Mar*_*Bro 8 java list add illegalargumentexception

我有代码

private List<Field> subFields;
private Collection<Field> subFieldsCollection;

...

try {
    if (subFields == null && subFieldsCollection != null && !subFieldsCollection.isEmpty()) {
        subFields = new ArrayList<>();
        subFields.addAll(subFieldsCollection);
    }
} catch (IllegalStateException e) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

而且我想知道它怎么会IllegalStateException被扔掉.它显然发生在我的应用程序的用户身上,但我无法追踪错误.

文件Collection.addAll()说:

IllegalArgumentException - 如果由于插入限制,此时不能添加所有元素

但是什么是插入限制?

我想这取决于集合的确切类型.我使用的ArrayList,所以让我们检查的文档addAll()List界面:

IllegalArgumentException - 如果指定集合的​​元素的某些属性阻止将其添加到此列表中

那么,什么元素属性可以阻止元素添加到List?我的两个集合属于同一类型,我应该能够添加空值.

有人可以向我解释一下吗?

Dav*_*ell 1

根据您从用户那里获得的信息量,这可能是无法回答的。但我会做出一个猜测,如果有进一步的证据与它相矛盾,我会删除我的答案。:)

假设您编写了所有代码,我同意addAll()不能抛出IllegalStateException(并且所有讨论IllegalArgumentException都是无关紧要的)。

我的猜测是,错误不是源自该addAll()调用,而是源自代码中尝试操作这些集合之一的另一个调用(未显示)。例如,可以通过尝试迭代列表(使用通过 获得的迭代器)并删除一个项目,然后尝试删除另一个项目而不调用 来获得。类似地,可以将一个放入从 获得的迭代器中。所以我的猜测是,在操纵列表的某个地方,会发生其中一件事。IllegalStateException.iterator()Iterator.next()Iterator.set()ArrayList

或者,其他集合实现可以通过多种方式抛出异常。因此,如果我们不确定它是否与 相关ArrayList,那么我们就没什么可继续的了。