ArrayIndexOutOfBoundsException: -32.443 con iteratore .Next su LinkedList
-
26-10-2019 - |
Domanda
Sul mio EJB App (Java EE), procedo una lista (LinkedList) da inserire nel db ed ho ottenuto l'errore: ArrayIndexOutOfBoundsException: -32.443
Codice I come
Iterator itertator = myList.iterator();
while (itertator.hasNext()) {
MyObject myObject = (MyObject) itertator.next();
...
}
Mi chiedo come ho già uso iterator.next il motivo per cui potrebbe ha indexOutOfBound?
Registro completa:
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)
Il mio EJB App si accede da un client Java in multi-threading, l'elenco è implementato in EJB sé prendendo l'id dal client per trovare i dati inserire in un LinkedList e quindi inviare l'elenco da inserire per l'iterazione come sopra, da a caso essa ha ricevuto l'errore.
Chiunque potrebbe aiutare a trovare l'indizio? O il problema perché sto usando LinkedList, la dimensione dell'oggetto non è sufficiente?
Soluzione
I piacerebbe pensare che la lista non è thread-safe. Nel caso la lista si accede da un numero di fili di un altro thread accede l'ultimo elemento al momento, il iterator.hasNext()
è vero. Ma quando un altro thread fa un iterator.next()
, quindi si tenta di accedere al successivo elemento che non è disponibile. Il fatto, che è errore si verifica casualmente è un altro suggerimento per questo. Utilizzando un elenco thread-safe sarebbe una buona idea in questo caso. Altrimenti sincronizzazione manualmente l'elenco è necessario:
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}