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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章