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?

È stato utile?

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());
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top