ArrayList.addAll(ArrayList)抛出SOMETIMES UnsupportedOperationException

Ros*_*atl 12 java exception list arraylist

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

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

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

aio*_*obe 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;
}
Run Code Online (Sandbox Code Playgroud)

(在你的评论中你写的// returns ArrayList.我不知道你从哪里得到这个,但我确实知道一件事:一个ArrayList总会支持这个addAll操作.)

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

List<Event> eventList = new ArrayList<Event>(eventTable.getEvents());
Run Code Online (Sandbox Code Playgroud)

  • 通常它是一个用Arrays.asList()包装的数组 (4认同)
  • 你是对的,我错过了默认的Collections.emptyList().一定是原因. (2认同)