ArrayList.add 抛出 ArrayIndexOutOfBoundsException [重复]

Posted

技术标签:

【中文标题】ArrayList.add 抛出 ArrayIndexOutOfBoundsException [重复]【英文标题】:ArrayList.add throws ArrayIndexOutOfBoundsException [duplicate] 【发布时间】:2012-03-26 19:19:42 【问题描述】:

我正在尝试将对象添加到 ArrayList 并抛出 ArrayIndexOutOfBoundsException 以下是代码

private void populateInboxResultHolder(List inboxErrors)
    inboxList = new ArrayList();
    try                
        inboxHolder = new InboxResultHolder();
        //Lots of Code
        inboxList.add(inboxHolder);
    catch(Exception e)
        e.printStackTrace();
    

例外是

[3/7/12 15:41:26:715 UTC] 00000045 SystemErr     R java.lang.ArrayIndexOutOfBoundsException
[3/7/12 15:41:26:721 UTC] 00000045 SystemErr     R      at java.util.ArrayList.add(ArrayList.java:378)
[3/7/12 15:41:26:721 UTC] 00000045 SystemErr     R      at com.ml.fusion.ui.common.web.bean.inbox.InboxSearchBean.populateInboxResultHolder(InboxSearchBean.java:388)    
[3/7/12 15:41:26:721 UTC] 00000045 SystemErr     R      at com.ml.fusion.ui.common.web.bean.inbox.InboxSearchBean.searchInboxErrors(InboxSearchBean.java:197)
[3/7/12 15:41:26:721 UTC] 00000045 SystemErr     R      at com.ml.fusion.ui.common.web.bean.inbox.InboxSearchBean.viewInbox(InboxSearchBean.java:207)

但是根据 ArrayList.add 的签名,它不应该抛出这个异常。 请帮忙。

【问题讨论】:

好吧,既然 IndexOutOfBoundsException 是一个 RuntimeException,它可以在方法签名中不提及。 ArrayIndexOutOfBoundsException 是运行时异常,而不是检查异常,因此它不一定会出现在抛出它的方法的签名中。 没错。但是如果您查看 add 方法本身,则不可能抛出此异常 【参考方案1】:

ArrayList.add() 绝不应该在“正确”使用的情况下抛出 ArrayIndexOutOfBoundsException,因此您似乎正在以不支持的方式使用您的 ArrayList

仅从您发布的代码很难判断,但我猜您正在从多个线程访问您的ArrayList

ArrayList 不同步,因此不是线程安全的。如果这是问题,您可以通过使用 Collections.synchronizedList() 包装您的 List 来解决它。

将您的代码更改为以下内容应该可以解决问题:

private void populateInboxResultHolder(List inboxErrors)
    List inboxList = Collections.synchronizedList(new ArrayList());
    try                
        inboxHolder = new InboxResultHolder();
        //Lots of Code
        inboxList.add(inboxHolder);
    catch(Exception e)
        e.printStackTrace();
    

【讨论】:

我确实从那个角度考虑过。但即使在这种情况下,它也不应该抛出异常,因为我们正在执行 add 而不是 add(index,Obj)。 如果您从多个线程访问ArrayList 而不同步它,它中断。我认为正在发生的事情是两个线程正在尝试同时修改位于ArrayList 之下的Array,因此当其中一个线程尝试添加新值时,它的大小不正确。 没有。如果您在其合同之外使用某些东西,则其行为将变得不确定。这意味着您可以期望它抛出任何RuntimeException 或损坏您的数据或执行任何操作。文档很清楚,ArrayList 在多个线程中不受支持,因此在这种情况下不会有任何定义的行为。 它抛出了这个异常,因为它试图向一个索引太大的Array 添加一些东西。 ArrayList 将其数据存储在 Array 中,并自动保持 Array 的大小。但是,如果您同时从多个线程访问ArrayList,则Array 维护代码并不总是以“正确的顺序”运行,因此您会得到ArrayIndexOutOfBoundsException。认为自己很幸运,您遇到了异常,而不仅仅是一些损坏或丢失的数据。 如果您从多个线程访问您的ArrayList,这绝对是问题的根源。 不用了,谢谢。除非您尝试使用 Collections.synchronisedList() 并且没有解决问题,否则没有什么可讨论的。【参考方案2】:

您发布的代码不会抛出 ArrayIndexOutOfBoundsException。

得到的异常是在你省略的部分抛出的。看看你的堆栈跟踪。导致异常的 InboxSearchBean。很可能它在索引无效的列表上执行 get(index)。

【讨论】:

以上是关于ArrayList.add 抛出 ArrayIndexOutOfBoundsException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList.add 不适用于 AsyncTask

显示未能找到类型或命名空间名称“Arraylist”(是不是缺少using指令或程序集引用)求大神解

list遍历时删除元素

2019JAVA第六次实验报告

ArrayList add get remove 源码解析

ArrayList add() 有时不会将从 Firebase 获取的元素添加到 ArrayList