zoukankan      html  css  js  c++  java
  • java.lang.NoSuchMethodError

     
     
    错误:在jdk1.6或jdk1.7运行代码时,出现如下错误,提示找不到此方法
    Exception in thread "main" java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
     
    原因代码中调用了ConcurrentHashMap<K, V>的keySet()方法,但是这个方法在jdk1.8中发生了改变
    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:使用Eclipse修改编译时的jdk版本
    1).在pom中将编译的jdk版本改为jdk1.6/1.7,在jdk1.6/1.7运行时还是报一样的错
    2).在pom中将编译的jdk版本改为jdk1.6/1.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。
  • 相关阅读:
    定时器实现点击重新发送信息倒计时显示
    新浪微博5s钟后跳转页面
    时钟制作代码
    判断线段相交
    POJ1265:Area(多边形面积公式+pick公式) 好题
    ACM零散知识
    POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage
    计算几何初步认识
    UVA10026:Shoemaker's Problem(贪心)
    UVA10020:Minimal coverage(最小区间覆盖)
  • 原文地址:https://www.cnblogs.com/zengzhihua/p/9203104.html
Copyright © 2011-2022 走看看