0

以下のようなコードがあり、特に (String file : files) の行で ConcurrentModificationException を取得しています。

繰り返しを行うときに「ファイル」に対して何も変更しないのに、なぜ例外が発生し、どのように回避すればよいのでしょうか? ご提案ありがとうございます。

int getTotalLength(final HashSet<String> files) {
        int total = 0;
        int len;
        for (String file : files) {
            len = getLength(file);
            if (len != Long.MIN_VALUE) {
                total += len;
            }
        }
        return total;
    }




      int getLength(String file) {
        int len = Long.MIN_VALUE;

        if (file == null) {
            return len;
        }

        File f = new File(file);

        if (f.exists() && f.isFile()) {
            len = f.length();
        }

        return size;
    }
4

1 に答える 1

3

コメントを参照すると、宣言final HashSet<String> filesすると変数がfilesフィナーレになります。つまり、この変数のスコープ内でこの変数に別のオブジェクトを割り当てることはできません。HashSetそれ自体は変更可能なオブジェクトであり、変更することができます - final 修飾子とは何の関係もありません (set オブジェクト自体への参照は同じです)。同じオブジェクト (同じハッシュセット) で同時に作業したい場合は、synchronizedブロックまたはメソッドを使用します。

一般的に言えば、同様のバリアントでforループを使用して反復されているコレクションを (同じスレッドまたは別のスレッドで) 変更することはできません。for-each

于 2013-08-20T20:31:39.617 に答える