2011-08-29 61 views
12

我有一個從某些分頁字符串數據讀取列表的代碼。我不明白 - 爲什麼UnsupportedOperationException拋出addAll(),爲什麼它是一種隨機行爲?ArrayList.addAll(ArrayList)拋出SOMETIMES UnsupportedOperationException

我知道創建目標ArrayList,而不是添加到返回的解決問題,我正在尋找更好的理解而不是修復。

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

回答

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操作)

解決它,正如你提到,正確的方法做

+4

通常它是一個數組,包裹着Arrays.asList() –

+0

是的,這是真的。 :-) – aioobe

+2

你說得對,我錯過了默認Collections.emptyList()。它一定是原因。 –

2

這取決於List的實際執行情況。

例如,如果使用Collections.unmodifiableList()獲得基礎列表,則調用addAll()或任何其他修改方法將拋出UnsupportedOperationException

0

當它拋出一個異常時,它應該顯示出確切的行號和源代碼文件 - 你應該能夠準確找出爲什麼它拋出異常。

我的猜測是,在某些情況下,eventTable.getEvents()返回一個不可變的列表,或類似的東西 - 但不知道eventTable是什麼,很難說肯定。如果您可以製作一個簡短但完整的程序來演示問題,那會使診斷更容易。

相關問題