ArrayIndoxOutofBoundSexception: -32443 con Iterator .Next en LinkedList
-
26-10-2019 - |
Pregunta
En mi aplicación EJB (Java EE), procedo una lista (LinkedList) para insertar en DB y recibí un error: ArrayInDexOutofBoundSException: -32443
Yo codifico como
Iterator itertator = myList.iterator();
while (itertator.hasNext()) {
MyObject myObject = (MyObject) itertator.next();
...
}
Me pregunto ya que ya uso iterator.next ¿Por qué podría tener índiceutOfBound?
Registro completo:
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)
Un cliente de Java accede a mi aplicación EJB en múltiples subprocesos, la lista se implementa en EJB tomando la identificación del cliente para encontrar datos de datos en una lista de enlaces y luego enviar la lista a insertar al iterando como se indicó anteriormente, al aleatoriamente. tengo error.
¿Alguien podría ayudar a encontrar la pista? ¿O el problema porque estoy usando LinkedList, el tamaño del objeto no es suficiente?
Solución
Supongo que la lista no es segura. En caso de que la lista sea accedida por varios hilos, un otro hilo accede al último elemento en este momento, el iterator.hasNext()
es verdad. Pero cuando otro hilo hace un iterator.next()
, luego intenta acceder al siguiente elemento que no está disponible. El hecho de que el error sucede al azar es otra pista para eso. Usar una lista segura de hilo sería una buena idea en este caso. De lo contrario, es necesario sincronizar manualmente la lista:
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}