Ricevo un ArrayIndexOutOfBoundsException
all'avvio del servizio (creazione bean) quando utilizzo le funzionalità di Java 8.ArrayOutOfBoundsException sulla creazione di bean durante l'utilizzo di costrutti Java 8
Java 8 è stato configurato e ha funzionato. Il codice viene compilato correttamente. All'avvio del servizio, il servizio non riesce ad ascoltare la porta man mano che i bean non vengono creati. Quando cambio il codice (rimuovi i costrutti java 8) il servizio si avvia e tutto funziona correttamente.
Questo è il codice che sto usando (il codice di lavoro per il quale avvia il servizio):
for (Item itemObject : response) {
if (itemObject.hasId()) {
idList.add(String.valueOf(itemObject.Id());
}
}
Stesso codice utilizzando Java 8 costrutti:
response.parallelStream()
.filter(itemObject -> itemObject.hasId())
.map(itemObject -> itemObject.getId())
.forEach(id -> idList.add(id));
Il fagiolo per la classe che contiene questo pezzo di codice viene creato utilizzando la scansione dei componenti.
Quello che segue è il messaggio di eccezione quando il secondo blocco di codice viene utilizzato al posto del primo:
Exiting with throwable: java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace/.../GetContainerIdForFcSkuAdapter.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880
java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace....Some.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880
Che non ha senso per me è, perché è il codice all'interno di una funzione (che è non il costruttore della classe bean) durante la creazione del bean. Lo chiedo, perché l'eccezione non c'è quando utilizzo il ciclo for normale invece del flusso parallelo. Non dovrebbe sorgere un ArrayOutOfBoundsException
quando viene chiamata la funzione e questo codice viene effettivamente utilizzato.
Come posso risolvere questo problema?
Che cos'è 'idList'? Nella seconda versione stai usando 'parallelStream', quindi aggiungi elementi a questo elenco da più thread. L'implementazione della lista che usi thread-safe? L'errore scompare se usi 'stream()' invece di 'parallelStream()'? – Jesper
Inoltre, il modo normale per ottenere il contenuto di un flusso in un elenco è 'Elenco list = stream.collect (Collectors.toList())' invece di 'stream.forEach (o -> list.add (o)' –
Jesper
non sto aggiungendo realmente da più thread, Java sta srotolando internamente il ciclo e parallelizzando, esiste ancora un errore sull'utilizzo del vapore, come detto, il blocco del codice deve essere eseguito quando viene chiamata la funzione, non sulla creazione di bean. questo blocco si usa e dà ArrayIndexOutOfBounds all'avvio del servizio. Per favore guarda la mia risposta qui sotto e dimmi se pensi che potrebbe essere un motivo – akshitBhatia