List.addAll()何时引发IllegalStateException? - java

我有代码

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) {
    ...
}

我想知道如何将IllegalStateException抛出。这显然发生在我的应用程序的用户身上,但是我无法跟踪出了什么问题。
Collection.addAll()的文档说:

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

但是插入限制是什么?

我猜这取决于集合的确切类型。我正在使用ArrayList,因此让我们检查docs的addAll()接口的List:

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

那么,什么元素属性可以阻止将该元素添加到列表中?我的两个集合都是相同的类型,我应该能够添加空值。

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

参考方案

根据您从用户那里获得的信息量,这可能无法回答。但是,我会做出猜测,如果有进一步的证据违背了我的答案,请删除我的答案。 🙂

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

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

另外,其他收集实现有很多方法可以抛出一个。因此,如果我们不确定它是否与ArrayList有关,那么我们的工作就很少了。

Java-固定大小的列表与指定初始容量的列表之间的差异 - java

我在理解这一点上遇到了问题。当我们做 List<Integer> list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List<Integer> list2 = new A…

与在Java中分配数组与分配链表相比,要使用多少内存? - java

我的猜测是,存储在数组中的每个值都有32位/ 64位字(取决于CPU)。因此它将是数组大小X 32位/ 64位。对于链表,存储指向下一个元素的引用将是链接列表的两倍。因此它将是2 *数组大小X 32位/ 64位。这是正确的,我有什么遗漏吗? java大神给出的解决方案 多得多。链表中的每个元素都有:指向下一个元素的指针,指向上一个元素的指针,指向项目值的指针…

从方法参数或引用创建新对象 - java

public setArrayList(List<Integer> list) { this.list = list; //OR this.list = new ArrayList<Integer>(list); } 我看到不同的人可以交替使用此代码。这两种实现之间有区别吗? 参考方案 是的-这两个示例在功能上有所不同。public …

如何确保列表中的项目是连续的? - java

美好的一天 !我想问一下我是否有清单1,2,3,4,5 ..然后我将替换值“ 3”插入到“ 7”,这将提示我错误原因是列表不连续。List<Domain> items = new ArrayList<Domain>(); 参考方案 您可以重写ArrayList,设置和添加方法以检查设置/添加的项是否有效,如果无效,则抛出Illegal…

使用番石榴从列表中删除重复项 - java

如何借助 Guava api 从列表中删除重复项?目前,我正在关注:private List<T> removeDuplicate(List<T> list){ return new ArrayList<T>(new LinkedHashSet<T>(list)); } 参考方案 可能最有效的方法是Immuta…