我有代码
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?我的两个集合属于同一类型,我应该可以添加空值..
有人可以向我解释一下吗?
答案 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
答案 3 :(得分:0)
这取决于实施。如果您检查ArrayList
ArrayList
,这是您使用的实际课程,您会看到这一点。
抛出: NullPointerException - 如果指定的集合为null
因此,IllegalArgumentException
不应该抛出{{1}}。如果您要使用其他实现或包装器(请参阅the documentation,注意,此示例不会引发此类异常),则可能会抛出此类异常。
因此,请从您的用户那里获取日志记录并尝试重现该问题。