当前位置: 首页 > 知识库问答 >
问题:

你什么时候可以去。addAll()抛出非法状态异常?

颛孙品
2023-03-14

我有密码

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怎么会发生这种情况。这显然发生在我的应用程序的一个用户身上,但我无法跟踪出了什么问题。

集合的文档。addAll()表示:

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

但插入限制是什么?

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

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

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

有人能给我解释一下吗?


共有3个答案

茅昀
2023-03-14

这确实取决于实施情况。如果您查看文档中的ArrayList,它是您实际使用的类,您将看到这一点。

如果指定的集合为null,则抛出:NullPointerExcture

因此,您的ArrayList不应抛出IllegalArgumentException。如果您要使用另一个实现或包装器(请参阅不可修改列表,请注意,此示例不会引发此类异常),它可能会引发此类异常。

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

百里泓
2023-03-14

您的代码永远不能抛出IllegalArgumentExcture,因为ArrayList#addAll不能抛出这样的异常。

为了获得该异常,您必须使用一个实现集合的类,在该类中可以抛出此类异常。您可以通过扩展ArrayList和覆盖所涉及的方法来轻松创建自己的方法。

孟英锐
2023-03-14

根据用户提供的信息量,这可能无法回答。但我会做一个猜测,如果有进一步的证据与我的答案相抵触,我会删除我的答案

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

我的猜测是,错误不是源于addAll()调用,而是源于代码中另一个试图操作其中一个集合的调用(未显示)。例如,可以通过尝试迭代列表(使用通过.iterator()获得的迭代器)并删除一个项,然后尝试删除另一个项而不调用迭代器来获取非法状态异常。next()。类似地,迭代器。set()可以在从ArrayList获取的迭代器中抛出一个。所以我猜,在操纵列表的某个地方,会发生这样的事情。

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

 类似资料:
  • 我已经用Java编写代码一段时间了。但有时,我不知道什么时候应该抛出异常,什么时候应该捕获异常。我正在做一个有很多方法的项目。层次结构是这样的- 所以目前我正在做的是-我在所有方法中抛出异常并在方法A中捕获它,然后将其记录为错误。 但我不确定这是否是正确的方法?或者我应该开始在所有方法中捕获异常。这就是为什么这种混乱始于我的 - 我什么时候应该抓住异常与何时应该抛出异常。我知道这是一个愚蠢的问题,

  • 这是我如何使用它 - 此外,我已经在超文本传输协议GET周围放置了一个最终块- 这是我的堆栈跟踪- 我正在使用Quartz来安排监控Httpendpoint的工作…这是我的连接池配置 马文依赖..神器版本 编辑-嗯,这个问题通过在最后一个块中不关闭CloseableHttp客户端而得到解决…有人能告诉我为什么它会这样吗?如果我关闭客户端,为什么连接池会关闭? 上面的closeablehttpcli

  • 问题内容: 最近,我接受了公司的采访,他们给了我一个编码问题。我得到了与纸牌有关的程序,其中一种方法是将纸牌洗牌。因此,我将该程序编写为: 在上面的代码中,我引发了我最怀疑的 IllegalArgumentException 。在什么情况下实际上应该抛出运行时异常?我们是否应该实际抛出运行时异常? 谢谢 问题答案: 我们是否应该实际抛出运行时异常? 是的,我们应该。运行时异常有特定的用途-它们发出

  • 我正在尝试使用下面的快速加载API 连接…等是完美的。 我确切地知道它在哪里失败 例外情况是 < code >线程“main”Java . lang . illegalstateexception中出现异常:示例失败。 这是我试图上传的表格。它是格式,当我通过记事本打开它时,它看起来像这样 为什么我会得到这个异常?我该如何改进?据我理解问题是< code > pstmtfld . setascii

  • 问题内容: 在我的应用程序中,有时会引发以下异常: 很难找到错误,因为在stacktrace中没有列出我的方法。那么,有人知道何时抛出此异常吗?感谢您的任何提示。 问题答案: 您可以在stacktrace中看到错误: 适配器的内容已更改,但ListView没有收到通知。确保不从后台线程修改适配器的内容,而仅从UI线程修改。 您应该调查一个线程,并使其与UI线程同步。 在Android中执行此操作的

  • 所以我必须做以下其中之一: 在每个doSomething调用周围添加try catch块 在main中添加throws语句 删除doSomething中的throws语句 将该条件作为前提条件,这样不遵循该条件就会导致未定义的行为或类似的行为。 3将不起作用,因为doSomething可能会在客户端使用时引发异常。1和2简直是多余的,我认为应该避免。 我的问题是:在提到的选项(或任何其他选项)中,