码迷,mamicode.com
首页 > 编程语言 > 详细

java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView

时间:2018-06-20 14:37:19      阅读:499      评论:0      收藏:0      [点我收藏+]

标签:cli   map   默认   导致   问题   return   ret   col   this   

错误Exception in thread "main" java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
 
原因:代码中调用了ConcurrentHashMap<K, V>的keySet()方法
jdk1.6/1.7中:
public Set<K> keySet() {  
    Set<K> ks = keySet;  
    return (ks != null) ? ks : (keySet = new KeySet());  
} 
jdk1.8中:
public KeySetView<K,V> keySet() {
    KeySetView<K,V> ks;
    return (ks = keySet) != null ? ks : (keySet = new KeySetView<K,V>(this, null));
}

这是高编译低运行导致的错误:class文件是jdk1.8编译的,运行时用的却是jdk1.6/1.7。
 
 
解决方法1:修改编译时的jdk版本
1.将编译和运行都改为jdk1.6/1.7,还是报一样的错
2.但是编译为jdk1.6/jdk1.7,运行为jdk1.8没问题
3.继续深入,发现使用eclipse的maven插件编译的时候,jdk版本默认使用的需要手动指定,pom里指定了没有用。。。
技术分享图片
JRE中手动指定jdk版本,然后打包运行,没有这个错了。
 技术分享图片

 

解决方法2(推荐):面向接口编程
将ConcurrentHashMap改成ConcurrentMap,即可解决 ConcurrentHashMap.keySet 返回参数不一致的问题。
 
总结:
1.编译和运行时用的jdk版本最好一致,如果不能保证尽量使用较低版本的jdk编译。
2.面向接口编程,因为接口不易改变,但是方法的入参和出参可能改变。
3.使用eclipse的maven插件时,需要手动选择jdk版本。
4.注意maven版本对jdk版本的要求,如果使用低版本的jdk来编译,那么可能需要使用相应低版本的maven。
技术分享图片
技术分享图片

 

java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView

标签:cli   map   默认   导致   问题   return   ret   col   this   

原文地址:https://www.cnblogs.com/zengzhihua/p/9203104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!