我正在尝试使用try-catch块处理java ConcurrentModificationException异常,但在编译代码时仍然会遇到同样的错误。
import java.util.*;
public class failFast{
public static void main(String[] args){
Map<Integer,String> map = new HashMap<>();
map.put(100,"Melani");
map.put(101,"Harshika");
map.put(102,"Nimna");
Iterator itr = map.keySet().iterator();
while(itr.hasNext()){
System.out.println(itr.next());
try{
map.put(103,"Nirmani");
}
catch(Exception e){
System.out.println("Exception is thrown "+e);
}
}
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at failFast.main(failFast.java:12)
我现在不知道你想要实现什么(你的代码对我来说没有多大意义(。基本上,你不能在迭代Map
或其他Collection
时更改它。更改底层结构的唯一方法是使用实际的Iterator
,但这是非常有限的。捕获ConcurrentModificationException
没有多大意义,因为在您的代码中,它总是被抛出的,所以捕获块将是您的正常代码流,这真的不好。
可能性1:将keySet
复制到另一个集合并迭代该
import java.util.*;
public class FailFast{
public static void main(String[] args){
Map<Integer,String> map = new HashMap<>();
map.put(100,"Melani");
map.put(101,"Harshika");
map.put(102,"Nimna");
// Copy keySet to an other collection and iterate over this one
Iterator itr = new ArrayList(map.keySet()).iterator();
while(itr.hasNext()){
System.out.println(itr.next());
map.put(103,"Nirmani");
}
可能性2:收集所有更改并在循环后应用它们(这就是我要做的(
import java.util.*;
public class FailFast{
public static void main(String[] args){
Map<Integer,String> map = new HashMap<>();
map.put(100,"Melani");
map.put(101,"Harshika");
map.put(102,"Nimna");
Iterator itr = map.keySet().iterator();
Map<Integer,String> changes = new HashMap<>();
while(itr.hasNext()){
System.out.println(itr.next());
changes.put(103,"Nirmani");
}
map.putAll(changes);