1

在我的 EJB 应用程序(Java EE)上,我将一个列表(LinkedList)插入到数据库中,但出现错误:ArrayIndexOutOfBoundsException:-32443

我编码为

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

我想知道我已经使用了 iterator.next 为什么它可以有 indexOutOfBound?

完整日志:

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 本身中实现的,方法是从客户端获取 id 以查找数据插入到链表中,然后通过如上所述的迭代将列表发送到插入,随机它有错误。

任何人都可以帮助找到线索?还是因为我使用LinkedList的问题,对象的大小不够?

4

1 回答 1

1

我假设该列表不是线程安全的。如果列表被多个线程访问,而另一个线程此时访问最后一个元素,iterator.hasNext()则为真。但是当另一个线程执行 a 时iterator.next(),您会尝试访问下一个不可用的元素。事实上,错误是随机发生的,这是另一个提示。在这种情况下,使用线程安全列表将是一个好主意。否则需要手动同步列表:

synchronized(list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext())
        foo(i.next());
}
于 2011-10-09T17:29:15.503 回答