知りたいこと
ArrayListの要素が5つの場合と3つの場合で、forEach内でのremoveメソッドを使用した際の動きが違う理由を知りたい。
現在分かっていること
リストの値が5つの場合forEachを行うと例外が発生してしまいますが、値が3つの場合は正常に動作されます。
解説では
拡張forで要素を1つずつ取り出し、その途中でremoveメソッドを使って要素を削除してしまっています。そのため、removeメソッドを実行するタイミングで例外がスローされます。
と、書いてありますが、要素のが3つの場合は例外が発生しないので、この解説は間違っているのでしょうか?
コードと出力結果1
Java
1public class main extends Parent{ 2 public static void main(String[] args){ 3 4 ArrayList<String> list = new ArrayList<>(); 5 list.add("a"); 6 list.add("b"); 7 list.add("c"); 8 list.add("d"); 9 list.add("e"); 10 11 12 System.out.println( list.toString()); 13 for(String str: list){ 14 if("b".equals(str)){ 15 list.remove(str); 16 }else{ 17 System.out.println(str); 18 } 19 } 20 21 for(String str: list){ 22 System.out.println(str); 23 } 24 } 25}
[a, b, c, d, e]
a
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at silver.main.main.main(main.java:29)
C:\Users\2170145.MAETEL\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
ビルド失敗(合計時間: 0秒)
コードと出力結果2
Java
1public class main extends Parent{ 2 public static void main(String[] args){ 3 4 ArrayList<String> list = new ArrayList<>(); 5 list.add("a"); 6 list.add("b"); 7 list.add("c"); 8 9 System.out.println( list.toString()); 10 for(String str: list){ 11 if("b".equals(str)){ 12 list.remove(str); 13 }else{ 14 System.out.println(str); 15 } 16 } 17 System.out.println( list.toString()); 18 for(String str: list){ 19 System.out.println(str); 20 } 21 } 22}
[a, b, c]
a
[a, c]
a
c
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/03 05:56 編集