我有一个代码从一些分页字符串数据中读取列表。我不明白 - 为什么在addAll()上抛出UnsupportedOperationException以及为什么它是随机行为?
我知道创建目标ArrayList并且不添加到返回的那个解决了问题,我正在寻找更好的理解而不是修复。
List<Event> eventList = eventTable.getEvents(); // returns ArrayList
while (hasNextPage()) {
goToNextPage();
eventList.addAll(eventTable.getEvents());
}
答案 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
是什么,很难肯定。如果你能够制作一个简短而完整的程序来证明这个问题,那么这将使诊断变得容易得多。