ArrayList.add throws ArrayIndexOutOfBoundsException

2022-09-02 01:03:02

我正在尝试将一个对象添加到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的签名,它不应该引发这个异常。请帮忙。


答案 1

ArrayList.add()永远不要抛出一个如果“正确”使用,所以看起来你正在以一种它不支持的方式使用你的。ArrayIndexOutOfBoundsExceptionArrayList

很难仅从您发布的代码中看出,但我的猜测是您正在从多个线程访问您的代码。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();
    }
}

答案 2

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

获得的异常将在您省略的部分中引发。看看你的堆栈跟踪。它的收件箱搜索Bean导致异常。最有可能的是,它在索引无效的列表中执行 get(索引)。


推荐