ArrayList.addAll(ArrayList) 有时抛出不受支持的操作异常

2022-09-04 19:24:17

我有一个从一些分页字符串数据中读取列表的代码。我不明白的是 - 为什么在addAll()上抛出不受支持的OperationException,为什么它是一种随机行为?

我知道创建目标ArrayList而不添加到返回的数组列表中可以解决问题,我正在寻找更好的理解而不是修复。

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

答案 1

List<Event>不一定是 .(但事实恰恰相反。ArrayList<Event>

您有时得到的原因是,有时返回支持的列表,有时返回不支持的列表。UnsupportedOperationExceptioneventTable.getEvents()addAll

例如,的实现可能如下所示:getEvents

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

(在您的评论中,您写道.我不知道你从哪里得到这个,但我知道有一件事是肯定的:An将永远支持这个操作。// returns ArrayListArrayListaddAll

正如你所提到的,解决它的正确方法是做

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

答案 2

这取决于 的实际实现。List

例如,如果底层列表是使用 Collections.unmodifiableList() 获得的,则调用或任何其他修改方法将抛出 .addAll()UnsupportedOperationException