Исключение ArrayIndexOutOfBoundsException:-32443 с итератором .далее в LinkedList

StackOverflow https://stackoverflow.com/questions/7307242

Вопрос

В моем приложении EJB (Java EE) я создаю список (LinkedList) для вставки в базу данных и получаю сообщение об ошибке:Исключение ArrayIndexOutOfBoundsException:-32443

Я кодирую как

Iterator itertator = myList.iterator();
while (itertator.hasNext()) {         
    MyObject myObject = (MyObject) itertator.next();
    ...
}

Интересно, поскольку я уже использую iterator.next, почему он может иметь привязку indexoutof?

Полный журнал:

Error message: java.lang.ArrayIndexOutOfBoundsException: -32443; nested exception is: com.my.exception.MyException
at com.ibm.ejs.container.RemoteExceptionMappingStrategy.mapEJBException(RemoteExceptionMappingStrategy.java:411)
at com.ibm.ejs.container.RemoteExceptionMappingStrategy.mapException(RemoteExceptionMappingStrategy.java:113)
at com.ibm.ejs.container.RemoteExceptionMappingStrategy.setUncheckedException(RemoteExceptionMappingStrategy.java:203)
at com.ibm.ejs.container.EJSDeployedSupport.setUncheckedException(EJSDeployedSupport.java:296)

Доступ к моему EJB-приложению осуществляется Java-клиентом в многопоточности, список реализован в самом EJB путем получения идентификатора от клиента для поиска вставки данных в linkedlist, а затем отправки списка для вставки путем повторения, как указано выше, случайным образом он получил ошибку.

Кто-нибудь мог бы помочь найти ключ к разгадке?Или проблема в том, что я использую LinkedList, размера объекта недостаточно?

Это было полезно?

Решение

Я бы предположил, что список не является потокобезопасным.В случае, если доступ к списку осуществляется несколькими потоками, а другой поток обращается к последнему элементу в данный момент, iterator.hasNext() это правда.Но когда другой поток выполняет iterator.next(), затем вы пытаетесь получить доступ к следующему элементу, который недоступен.Тот факт, что ошибка происходит случайным образом, является еще одним намеком на это.В этом случае хорошей идеей было бы использование потокобезопасного списка.В противном случае потребуется ручная синхронизация списка:

synchronized(list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext())
        foo(i.next());
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top