2013-08-19 85 views
0

我有以下的Java代碼:一個ConcurrentModificationException的拋出未經修改

HashMap<Integer, Lesson> overflow = new HashMap<Integer, Lesson>(); 
HashMap<Integer, Lesson> new_lessons = this.lessons; 
HashMap<Integer, Lesson> lessons = this.lessons; 
for (Integer lesson : lessons.keySet()) { 
    if(lessons.get(lesson).getLength().equals(LessonLength.DOUBLE)){ 
     if(lessons.containsKey(lesson + 1)){ 
      overflow.put(lesson + 1, lessons.get(lesson + 1)); 
      new_lessons.put(lesson+1, lessons.get(lesson)); 
      new_lessons.get(lesson).setLength(LessonLength.ONCE); 
      new_lessons.get(lesson+1).setLength(LessonLength.ONCE); 
     } 
     else{ 
      new_lessons.put(lesson+1, lessons.get(lesson)); 
      new_lessons.get(lesson).setLength(LessonLength.ONCE); 
      new_lessons.get(lesson+1).setLength(LessonLength.ONCE); 
     } 
    } 
} 

爲什麼會出現拋出ConcurrentModificationException的?

回答

3

您的new_lessonslessons變量具有相同的值 - 它們指的是同一個對象。所以像這樣的東西:

new_lessons.put(lesson+1, lessons.get(lesson)); 

...正在修改lessons,你會遍歷(通過其按鍵設置)。因此,這個問題。

這是可能,如果您沒有更改按鍵(即你只改變了與任何條目相關的值),那麼你可能是好的,但是這顯然並非如此,因爲如果lessons不包含一個關鍵爲lesson + 1,你正在添加它。

這聽起來像你應該複製new_lessons的原始地圖,以便你有兩個獨立的地圖。或者更簡單地說,只取鑰匙的複製入手:

List<Integer> keys = new ArrayList<Integer>(lessons.keySet()); 
for (Integer lesson : keys) { 
    ... 
} 

...,擺脫你的new_lessons變量,因爲它基本上是沒有意義的。

0

new_lessonslessons表示相同的散列映射。在迭代lessons時,您正在更改new_lessons。因此你有一個ConcurrentModificationException

要解決此問題,請嘗試創建this.lessons的副本。

1

因爲new_lessons.put(lesson+1, lessons.get(lesson));修改lessons' keySet()這就是你正在迭代的keySet()

HashMap<Integer, Lesson> new_lessons = this.lessons; 
HashMap<Integer, Lesson> lessons = this.lessons; 

不會創建新的HashMap <>的對象,但簡單的讓new_lessonslessons指向this.lessons

相關問題