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

时间:2015-07-22 11:08:00

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

我想知道如何抛出IllegalStateException。它显然发生在我的应用程序的用户身上,但我无法追踪错误。

Collection.addAll()的文档说:

  

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

但插入限制是什么?

我想这取决于集合的确切类型。我正在使用ArrayList,所以让我们检查addAll() List接口的文档:

  

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

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

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

4 个答案:

答案 0 :(得分:1)

您的代码永远不会抛出IllegalArgumentException,因为ArrayList#addAll不能抛出此类异常。

为了获得该异常,您必须使用实现Collection的类来抛出此类异常。您可以通过扩展ArrayList并覆盖所涉及的方法轻松制作自己的方法。

答案 1 :(得分:1)

根据您从用户获得的信息量,这可能无法回答。但我会猜测,如果有进一步的证据与之相反,我会删除我的答案。 :)

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

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

或者,其他集合实现可以通过多种方式抛出一个。因此,如果我们不确定它是否属于ArrayList,那么我们就没那么多了。

答案 2 :(得分:0)

我不知道任何抛出IllegalArgumentException的实现(在jre或任何库中)。

但是你可以轻松创建自己的实现,抛出这样的异常。界面onClick让用户知道,实施者可以使用Collection - 它没有说,实现者实际上使用它

一个例子:

IllegalArgumentException

结果我会推荐这种方法:

  • 检查您的代码,您正在为您的收藏添加语义合理项。不要将类import java.util.ArrayList; public class PickyList<T> extends ArrayList<T> { public static class SpecialThing { } @Override public boolean add(T e) { if (e instanceof SpecialThing) return super.add(e); throw new IllegalArgumentException(); } } 的对象添加到名为Person
  • 的列表中
  • 以适当的方式处理任何技术运行时异常。例如,回滚事务,进行日志记录,通知用户和/或支持团队
  • 考虑通知来电者您的方法(通过JavaDoc),您的方法可能会失败

答案 3 :(得分:0)

这取决于实施。如果您检查ArrayList ArrayList,这是您使用的实际课程,您会看到这一点。

  

抛出:       NullPointerException - 如果指定的集合为null

因此,IllegalArgumentException不应该抛出{{1}}。如果您要使用其他实现或包装器(请参阅the documentation注意,此示例不会引发此类异常),则可能会抛出此类异常。

因此,请从您的用户那里获取日志记录并尝试重现该问题。