Java_各種Exception解析
1、Exception in thread "main" java.util.ConcurrentModificationException
まずプログラムを見てみましょう
public class TestFor {
public static void oldFor(List<String> list) {
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (str.equals("2")) {
list.remove(i);
}
}
}
public static void newFor(List<String> list) {
for (String str : list) {
if (str.equals("2")) {
list.remove(str);
}
}
}
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
list1.add("4");
list1.add("5");
list1.add("6");
oldFor(list1);
System.out.println(list1);
List<String> list2 = new ArrayList<String>();
list2.add("1");
list2.add("2");
list2.add("3");
list2.add("4");
list2.add("5");
list2.add("6");
newFor(list2);
System.out.println(list1);
}
}
このプログラムはException in thread"main"javaに報告します.util.ConcurrentModificationException、newFor(list 2);この1行の新聞.
これはなぜですか.
プログラム内のforeach文
for (String str : list) { if (str.equals("2")) { list.remove(str); } }
次の反復器に相当します
for (Iterator
List,Set,Mapは反復する際に自身の長さの変更は許されないので,反復の内部ではList,Set,Mapのaddメソッドとremoveメソッドの使用は許されない.
この点を避ける愚かな方法がある.
public static void newFor(List<String> list) {
List<String> removeList = new ArrayList<String>();
for (String str : list) {
if (str.equals("2")) {
removeList.add(str);
}
}
list.removeAll(removeList);
}
これも確かに問題を解決することができますが、方法は本当に重くて、実はもっと簡単で効率的な方法があります.Iteratorを使うことです.removeメソッドは、次のとおりです.
public static void newFor(List<String> list) {
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String str = it.next();
if (str.equals("2")) {
it.remove();
}
}
}