2016-12-06 133 views
1
public static ArrayList<Job> ready = new ArrayList<Job>(); 
...later on.... 
ArrayList<Job> temp = ready; 
for (Iterator<Job> iterator = temp.iterator(); iterator.hasNext();) { 
    Job j = (Job) iterator.next(); 
    if (j.number == number) { 
     ready.remove(j); 
     ready.add(j); 
     system.devices-=devices; 
     j.devices+=devices; 
     iterator.remove(); 
    } 
} 

爲什麼會拋出錯誤?當然,準備好=溫度,但我正在迭代溫度,我沒有改變溫度。我怎樣才能解決這個問題?使用臨時列表時發生ConcurrentModificationException

+4

您試圖在遍歷整個列表時嘗試更改列表。 'temp'和'ready'是同一個列表 - 更改一個會改變另一個。如果您想複製列表,您可以執行'temp = new ArrayList (ready)'。 – khelwood

+2

發佈關於異常的問題時,必須包含完整的異常堆棧跟蹤,並在代碼中標識引發該異常的行。 –

+1

@khelwood你應該發表你的評論作爲答案。 –

回答

-2

您是通過添加和刪除元素,而你是遍歷它,而不是一個好主意,改變列表...

,而不是把那些符合條件

if (j.number == number) { 

在另一個列表中的元素和做temp.removeAll(c);

1

tempreadyready的任何變化將通過temp迭代中可以看出的參考。你實際上可以使用Collections.copy

ArrayList<Job> temp = new ArrayList<Job>(); 
Collections.copy(temp, ready); 
1

你試圖改變一個列表,當你迭代它。 tempready是相同的列表 - 更改一個更改另一個。如果你想拷貝的列表,你可以使用temp = new ArrayList<Job>(ready)

0

您正在嘗試在循環中修改集合,並且此循環無法支持此類操作。 您有兩種不同的解決方案: 1-將集合複製到另一個,並基於一個循環並修改另一個。 2-最佳做法是使用併發集合,例如: CopOnWriteArrayList,ConcurrentSkipListMap