拡張 for の中で remove
このコードを実行するとどうなるか。
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
for (String s : list) {
if (s.equals("a")) {
list.remove(s);
}
}
System.out.println(list);
}
}
- A
[b, c]と出力される - B
[a, b, c]と出力される - C 実行時に例外が発生する
- D コンパイルエラーになる
正解と解説を見る
正解: C
- A: 拡張 for の途中でリストを変更すると例外が発生するので、最後まで進みません。
- B: remove が呼ばれた後、次の要素に進むときに例外が発生します。
- C: 拡張 for でリストを回している途中で remove すると、ConcurrentModificationException が発生します。
- D: コンパイルは通ります。問題は実行時に起きます。
ポイント
- 拡張 for でリストを回している途中でリストを変更すると、
ConcurrentModificationExceptionが発生します。