2011-08-29 12 views
12

Ho un codice che legge l'elenco da alcuni dati di stringa paging. Cosa non capisco - perché la UnsupportedOperationException viene lanciata su addAll() e perché è una sorta di comportamento casuale?ArrayList.addAll (ArrayList) restituisce SOMETIMES UnsupportedOperationException

So che la creazione di ArrayList di destinazione e non l'aggiunta a quella restituita risolve il problema, sto cercando una migliore comprensione non una soluzione.

List<Event> eventList = eventTable.getEvents(); // returns ArrayList 
while (hasNextPage()) { 
    goToNextPage(); 
    eventList.addAll(eventTable.getEvents()); 
} 

risposta

18

List<Event> non è necessariamente un ArrayList<Event>. (È vero il contrario però.)

La ragione che si ottiene UnsupportedOperationException a volte, è perché eventTable.getEvents()volte restituisce una lista che supporta addAll e, a volte non è così.

L'attuazione di getEvents potrebbe ad esempio simile a questa:

if (noEventsAvailable) { 
    return Collections.emptyList(); 
} else { 
    List<Event> toReturn = new ArrayList<Event>(); 
    // populate list... 
    return toReturn; 
} 

(Nel tuo commento si scrive // returns ArrayList Non so dove hai questo da, ma so una cosa per certo. : Un ArrayList sarà sempre sostenere il funzionamento addAll)

il modo corretto per risolverlo è, come si parla, per fare

.
+4

Spesso è un array che è stato avvolto con Arrays.asList() –

+0

Yup, è vero. :-) – aioobe

+2

Hai ragione, mi mancava il default Collections.emptyList(). Deve essere la causa. –

2

Dipende dall'attuale implementazione di List.

ad esempio se l'elenco sottostante è stato ottenuto utilizzando Collections.unmodifiableList(), quindi chiamando addAll() o qualsiasi altro metodo di modifica verrà generato un UnsupportedOperationException.

0

Quando genera un'eccezione, dovrebbe mostrare il numero esatto della riga e il file del codice sorgente: dovresti riuscire a scoprire esattamente perché sta generando un'eccezione.

La mia ipotesi è che in determinate circostanze, eventTable.getEvents() restituisce un elenco immutabile, o qualcosa del genere - ma senza sapere cosa sia eventTable, è difficile da dire con certezza. Se è possibile produrre un programma breve ma completo che mostri il problema, ciò renderebbe molto più facile la diagnosi.

Problemi correlati