ArrayList.addAll(ArrayList)有时会抛出UnsupportedOperationException异常。

13

我有一段代码,可以从一些分页字符串数据中读取列表。我不明白- 为什么在addAll()上会抛出UnsupportedOperationException,并且为什么它是随机行为?

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

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

19

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;
}
在您的评论中,您写道//返回ArrayList。我不知道您从哪里得到这个信息,但我可以确定一件事:一个ArrayList将始终支持addAll操作。

解决它的正确方法是,如您所提到的,执行:

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

4
通常情况下,这是一个使用Arrays.asList()方法封装的数组。 - Garrett Hall
2
你说得对,我漏掉了默认的Collections.emptyList()。这一定是原因。 - Rostislav Matl

2

这取决于List的实际实现。

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


0

当它抛出异常时,应该显示确切的行号和源代码文件 - 您应该能够准确地找出为什么会抛出异常。

我猜想在某些情况下,eventTable.getEvents() 返回一个不可变列表或类似的东西 - 但是如果不知道 eventTable 是什么,很难确定。如果您能够编写一个简短但完整的程序来演示问题,那将使诊断变得更加容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接