在我的EJB应用程序(Java EE)上,我继续列表(LinkedList)以插入到db中,我收到错误: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以查找插入到链表中的数据,然后通过迭代将列表发送到insert,如上所述,随机出错。
任何人都可以帮忙找到线索?或者问题是因为我使用的是LinkedList,对象的大小还不够?
答案 0 :(得分:1)
我认为该列表不是线程安全的。如果列表由多个线程访问,另一个线程此时访问最后一个元素,则iterator.hasNext()
为真。但是当另一个线程执行iterator.next()
时,您尝试访问下一个不可用的元素。事实上,即错误随机发生是另一个暗示。在这种情况下,使用线程安全列表是个好主意。否则,必须手动同步列表:
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}