ArrayList.addAll(ArrayList)抛出SOMETIMES UnsupportedOperationException

时间:2011-08-29 12:15:34

标签: java list exception arraylist

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

我知道创建目标ArrayList并且不添加到返回的那个解决了问题,我正在寻找更好的理解而不是修复。

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

3 个答案:

答案 0 :(得分:18)

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());

答案 1 :(得分:2)

这取决于List的实际实施情况。

例如,如果使用Collections.unmodifiableList()获取基础列表,则调用addAll()或任何其他修改方法将抛出UnsupportedOperationException

答案 2 :(得分:0)

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

我的猜测是,在某些情况下,eventTable.getEvents()会返回一个不可变列表,或类似的东西 - 但不知道eventTable是什么,很难肯定。如果你能够制作一个简短而完整的程序来证明这个问题,那么这将使诊断变得容易得多。