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

错误: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。

http://maven.apache.org/docs/history.html

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

时间: 2024-10-12 21:22:32

java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView的相关文章

dubbox部署到jdk1.7环境,启动:java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()

本地用jdk1.8编译的服务提供端war包,部署到环境报错了: INFO: Initializing Spring root WebApplicationContext [16/08/17 05:14:54:054 CST] localhost-startStop-1 INFO context.ContextLoader: Root WebApplicationContext: initialization started [16/08/17 05:14:54:054 CST] localhos

java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;

spring3_hibernate 集成报错信息 java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object; 根据分析得知缺少必要的jar: jboss-common.jar  和 jboss-logging.jar 原文地址:https://www.cnblogs.com/northeastTycoon/

springmvc 启动报 java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;

maven项目,所有的包都是按照提示,自动添加的,知道启动项目报错 才发现 spring-web 和 spring-webmvc 版本不一致 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.7.RELEASE</version> <scope>compile&

java.lang.NoSuchMethodError: org.springframework.dao.IncorrectResultSizeDataAccessException

spring data jpa  运用,在dao类中写自己新增的方法,使用@query写hql语句,出现以下异常: Caused by: java.lang.NoSuchMethodError: org.springframework.dao.IncorrectResultSizeDataAccessException.<init>(Ljava/lang/String;ILjava/lang/Throwable;)V at org.springframework.orm.jpa.EntityM

关于java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccessible

<span style="font-size:18px;"> java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccessible(Ljava/lang/reflect/Constructor;)V at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:146) at org.spring

java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager

java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager 问题: 使用Springboot打包为war部署于Tomcat7中报错 java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.get

Spring Boot常见问题(二)Unable to start embedded container; nested exception is java.lang.NoSuchMethodError: org.apache.tomcat.util.scan.StandardJarScanner.setJarScanFilter(Lorg/apache/tomcat/JarScanFilter;

问题描述:通过Spring Boot官方提供的方式,写出如下HelloWorld代码. @Controller @EnableAutoConfiguration public class HelloWorld { @RequestMapping("/wu") @ResponseBody String home() { return "Hello World!"; } public static void main(String[] args) throws Exce

Junit测试出现异常:Exception in thread &quot;main&quot; java.lang.NoSuchMethodError: org.junit.platform.commons.util.

在进行单元测试时,测试出现异常 Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.ReflectionUtils.getDefaultClassLoader()Ljava/lang/ClassLoader; 错误就在pom.xml的依赖中,仔细查看控制台输出你会发现IntelliJ IDEA正在尝试使用JUnit5运行我的测试用例. at com.intelli

记一次netty版本冲突,报java.lang.NoSuchMethodError: io.netty.util.internal.ObjectUtil.checkPositive的问题

elasticsearch 5.6中使用TransportClient初始化抛异常 在引入elasticsearch5.6的transportclient包中,会引入netty进行通信. <!-- transport客户端 --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version