您的位置:首页 > 编程语言 > Java开发

JAVA 运行时报错:catch an exception java.util.ConcurrentModificationException

2017-08-02 19:51 507 查看
写代码时候遇到,记一笔。

Map<String, String> needToQueryDate = new HashMap<String, String>();
needToQueryDate.add("201708","Y");
needToQueryDate.add("201707","Y");
needToQueryDate.add("201706","Y");
needToQueryDate.add("201705","N");

List<String> newUserNeedToQueryDate = new ArrayList<String>();
needToQueryDate.add("201708");
needToQueryDate.add("201707");

for(String needToQueryDateItem : needToQueryDate.keySet()){
if(!needToQueryDate.contains(needToQueryDateItem)){
needToQueryDate.remove(needToQueryDateItem);
}

2017-08-02 15:37:19,599 [jboss-server-executor-4] ERROR QueryServiceImpl - TraceId:9914, catch an exception
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at com.zzf.service.impl.QueryServiceImpl.handleLib(QueryServiceImpl.java:726)
at com.zzf.service.impl.QueryServiceImpl.billQuery(QueryServiceImpl.java:187)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.doRun(ChannelUpstreamEventRunnable.java:43)
at org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:67)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)


Google原因为:

Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterator(Object ele=it.next())会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。

Google解决办法有:

1) 根据实际程序,手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。

2) 使用ConcurrentHashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java