我们如何使用try-catch处理Java ConcurrentModificationException



我正在尝试使用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);

相关内容

  • 没有找到相关文章

最新更新