2013-08-19 45 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

相关问题