0

私は次のJavaコードを持っています:

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 がスローされるのはなぜですか?

4

3 に答える 3

3

あなたnew_lessonslessons変数は同じ値を持っています - それらは同じオブジェクトを参照しています。だから、このようなもの:

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

... を変更lessonsしています。これを (キーセットを介して) 反復処理しています。したがって、問題。

キー セットを変更しなかった場合 (つまり、エントリに関連付けられた値のみを変更した場合) は問題ない可能性がありますが、明らかにそうでありlessonsませんlesson + 1。それを追加します。

の元のマップをコピーnew_lessonsして、2 つの独立したマップを作成する必要があるようです。または、より簡単に、キーのコピーを取得して開始します。

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

new_lessons...基本的に無意味なので、変数を取り除きます。

于 2013-08-19T12:54:13.627 に答える
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<> オブジェクトを作成しませんが、単純な letnew_lessonslessons指し示すthis.lessons

于 2013-08-19T12:54:53.770 に答える
0

new_lessonslessons同じハッシュマップを表します。new_lessonsを繰り返しながら変更していますlessons。したがって、 がありConcurrentModificationExceptionます。

これを修正するには、 のコピーを作成してみてくださいthis.lessons

于 2013-08-19T12:54:47.327 に答える