Pregunta ArrayList.addAll (ArrayList) arroja A VECES UnsupportedOperationException


Tengo un código que lee la lista de algunos datos de cadena paginada. Lo que no entiendo - ¿Por qué se lanza UnsupportedOperationException en addAll () y por qué es una especie de comportamiento aleatorio?

Sé que crear ArrayList objetivo y no agregar al que se devuelve soluciona 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());
}

12
2017-08-29 12:15


origen


Respuestas:


List<Event> no es necesariamente un ArrayList<Event>. (Sin embargo, lo opuesto es verdad)

La razón por la que obtienes UnsupportedOperationException a veces, es porque eventTable.getEvents()  a veces devuelve una lista que admite addAll y a veces no.

La implementación de getEvents podría por ejemplo verse así:

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

(En tu comentario escribes // returns ArrayList. No sé de dónde sacas esto, pero sé una cosa segura: un ArrayList será siempre apoyen el addAll operación.)

La forma correcta de resolverlo es, como mencionas, hacer

List<Event> eventList = new ArrayList<Event>(eventTable.getEvents());

18
2017-08-29 12:18



Depende de la implementación real de List.

por ejemplo, si la lista subyacente se obtuvo usando Collections.unmodifiableList () entonces llamando addAll() o cualquier otro método de modificación arrojará un UnsupportedOperationException.


2
2017-08-29 12:19



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.

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


0
2017-08-29 12:19