2012-03-09 3 views
10

Я пытаюсь добавить объект в ArrayList и его метания ArrayIndexOutOfBoundsException Ниже приведен кодArrayList.add бросает 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 он не должен бросать это исключение. Пожалуйста, помогите.

+2

Ну, поскольку IndexOutOfBoundsException является исключением RuntimeException, его можно выбросить без указания в сигнатуре метода. – Jerome

+2

«ArrayIndexOutOfBoundsException» - это исключение во время выполнения, а не проверенное исключение, поэтому оно не обязательно появляется в сигнатуре методов, которые его бросают. –

+0

это правильно. Но если вы посмотрите на метод добавления, то нет возможности получить это исключение. – mavrav

ответ

21

ArrayList.add() не должен бросать ArrayIndexOutOfBoundsException, если используется «правильно», поэтому кажется, что вы используете свой ArrayList таким образом, который он не поддерживает.

Трудно сказать только из кода, который вы опубликовали, но я предполагаю, что вы получаете доступ к вашему ArrayList из нескольких потоков.

ArrayList не синхронизирован и не является потокобезопасным. Если это проблема, вы можете исправить это, обернув свой List, используя Collections.synchronizedList().

+0

Я действительно думал в этом уголке. Но даже в этом случае он не должен генерировать это исключение, поскольку мы делаем add и не добавляем (индекс, OBJ). – mavrav

+2

Если вы получаете доступ к 'ArrayList' из нескольких потоков, не синхронизируя его, он ** будет ** ломаться. Я думаю, что два потока пытаются изменить «Array», который лежит в основе «ArrayList» одновременно, поэтому это не правильный размер, когда один из потоков пытается добавить новое значение. –

+0

Должно ли это бросать ConcurrentModificationException? – mavrav

-2

Код, который вы отправили будет не бросать ArrayIndexOutOfBoundsException.

Исключено, что вы получите, вбрасывается в ту часть, которую вы пропустили. Взгляните на ваш стек. Его InboxSearchBean вызывает исключение. Скорее всего, он выполняет get (index) в списке с недопустимым индексом.

Смежные вопросы