2011-08-29 11 views
12

Tengo un código que lee la lista de algunos datos de cadena paginados. Lo que no entiendo - ¿por qué la UnsupportedOperationException se lanza en addAll() y por qué es un tipo de comportamiento aleatorio?ArrayList.addAll (ArrayList) throws VECES UnsupportedOperationException

Sé que crear el objetivo ArrayList y no agregar al que se ha encontrado resuelve el problema, estoy buscando una mejor comprensión, no una solución.

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

Respuesta

18

List<Event> no es necesariamente un ArrayList<Event>. (Lo contrario es cierto, sin embargo.)

La razón se obtiene UnsupportedOperationException veces, se debe a eventTable.getEvents()veces devuelve una lista que apoya addAll ya veces no lo hace.

La implementación de getEvents podría por ejemplo tener este aspecto:

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

(En su comentario se escribe // returns ArrayList No sé donde tienes esto desde, pero sé una cosa es segura. : Un ArrayListserá siempre apoyar la operación addAll)

la forma correcta de resolver es, como usted menciona, hacer

.
+4

A menudo es una matriz que estaba envuelto con Arrays.asList() –

+0

Sí, eso es cierto. :-) – aioobe

+2

Tienes razón, me perdí el Collections.emptyList() predeterminado. Debe ser la causa. –

2

Depende de la aplicación real de List.

por ejemplo, si la lista subyacente se obtuvo usando Collections.unmodifiableList() y luego llamar al addAll() o cualquier otro método de modificación lanzará un UnsupportedOperationException.

0

Cuando arroja una excepción, debe mostrar el número de línea exacto y el archivo de código fuente - debería poder averiguar exactamente por qué está lanzando una excepción.

Supongo que, bajo ciertas circunstancias, eventTable.getEvents() devuelve una lista inmutable, o algo así, pero sin saber qué es eventTable, es difícil de decir con certeza. Si puede producir un programa breve pero completo que demuestre el problema, eso haría que sea mucho más fácil de diagnosticar.

Cuestiones relacionadas