ArrayList.addAll (ArrayList) выбрасывает НЕКОТОРЫЕ UnsupportedOperationException - PullRequest
12 голосов
/ 29 августа 2011

У меня есть код, который читает список из некоторых строковых данных.Что я не понимаю - почему UnsupportedOperationException генерируется в addAll () и почему это своего рода случайное поведение?

Я знаю, создание целевого ArrayList и не добавление к возвращаемому решает проблемуЯ ищу лучшего понимания не исправить.

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

Ответы [ 3 ]

18 голосов
/ 29 августа 2011

List<Event> не обязательно ArrayList<Event>.(Однако верно и обратное.)

Причина, по которой вы иногда получаете UnsupportedOperationException, заключается в том, что eventTable.getEvents() иногда возвращает список, который поддерживает addAll, а иногда нет.

Например, реализация getEvents может выглядеть следующим образом:

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

(В своем комментарии вы пишете // returns ArrayList. Я не знаю, откуда вы это взяли, но я точно знаю одно: ArrayList будет всегда поддерживать операцию addAll.)

Правильный способ ее решения, как вы упоминаете, сделать

List<Event> eventList = new ArrayList<Event>(eventTable.getEvents());
2 голосов
/ 29 августа 2011

Это зависит от фактической реализации List.

например, если базовый список был получен с использованием Collections.unmodifiableList () , то при вызове addAll() или любом другом методе изменения будет получен UnsupportedOperationException.

0 голосов
/ 29 августа 2011

Когда выдается исключение, оно должно показывать вам точный номер строки и файл исходного кода - вы должны быть в состоянии точно узнать , почему выдает исключение.

Я предполагаю, что при определенных обстоятельствах eventTable.getEvents() возвращает неизменный список или что-то в этом роде, но, не зная, что такое eventTable, трудно сказать наверняка. Если вы можете создать короткую, но полную программу, которая демонстрирует проблему, это значительно упростит диагностику.

...