一个困扰很久的异常—java.lang.NoClassDefFoundError: com/google/gson/Gson
描述:
这个异常是在运行时抛出的,编译的时候没有任何问题,而且异常信息非常少,只有一句:java.lang.NoClassDefFoundError: com/google/gson/Gson
解决:
1、根据打印出的异常信息,最直观的会认为gson包出了问题,然后找到去类路径下找到gson包,没有问题;
2、第一步行不通,然后从NoClassDefFoundError入手,查阅相关资料,一般引起这个错误的原因大部分都是:
1)需要实例化的类定义中的初始化部分(如类属性定义、static 变量、static 块等)的代码很有可能抛出了异常
2)接着注释其中的 gson 部分代码,再进行调试,发现没有异常,错误原因找到了
3)但是gson包必须在项目用到,不能修改,所以必须用另外的方案,谷歌了一下,发现解决方案很多
1)首先尝试的第一个解决方案是,新建一个lib目录,把gson包放到lib目录中,调试结果,仍然报错
2)继续找第二个解决方案,新建一个classpath的Entry,然后把对应的gson的entry添加到classpath,调试结果仍然报错
3)尝试着第三种解决方案,我把gson的版本降低,原项目使用的是2.3.1,我改成2.2.2,调试结果仍然报错
3)最后,在这个类的父类(子类和父类在不同的项目里面)中添加gson包,调试通过
总结:
解决这个问题,主要从两个方面入手可以很快解决:
1、首先需要知道NoClassDefFoundError这个错误信息是因为什么引起的
这个错误大部分情况是由:类定义中的初始化部分(如类属性定义、static 变量、static 块等)的代码抛出异常引起的
2、第二个需要知道的是,JVM的类加载顺序,以及子类父类的加载顺序和加载情况;
1)加载类的时机:“类的代码在初次使用时才加载”,一般就是在我们new实例、使用静态域或者使用静态方法的时候去加载class文件
2)当我们new一个子类时,要去加载子类,可是在加载子类时,发现了extends关键字,说明有父类,那么先去加载父类,以此类推,一直加载到Object。
所有相关类加载完之后,从根基类开始执行静态变量、静态代码块,然后是下一个导出类,以此类推。静态方法在加载类的时候就会加载到内存静态存储区,无需构造类的实例就可以调用。
至此,所有的类都已经加载完成,可以开始实例化了,实例化时,先从根基类的构造方法开始执行起,然后是下一个导出类,以此类推。在这个过程中,需要注意的是,虽然执行了父类的构造方法,
但是没有生成父类的对象,“执行构造方法是为生成对象初始化的,并不是生成对象”。其实,最终只new了一个子类对象出来。
所以解决这个问题很简单,就是直接在父类的项目中添加gson包。
一个困扰很久的异常—java.lang.NoClassDefFoundError: com/google/gson/Gson的更多相关文章
- 出现java.lang.NoClassDefFoundError: com/google/common/base/Charsets异常错误
使用selenium,出现java.lang.NoClassDefFoundError: com/google/common/base/Charsets异常错误 原因:selenium-server- ...
- HBase中报错 java.lang.NoClassDefFoundError: com/google/protobuf/LiteralByteString
Protobuf(全称 Protocol Buffers)是 Google 开发的一种数据描述语言,能够将结构化数据序列化,可用于数据存储.通信协议等方面.在 HBase 里面用使用了 Protobu ...
- Selenium 运行时出现错误(java.lang.NoClassDefFoundError: com/google/common/base/Function)
已经写好了java脚本,点击运行的过程中如果出现如下的错误提示时: java.lang.NoClassDefFoundError: com/google/common/base/Function 问题 ...
- Caused by: java.lang.NoClassDefFoundError: com/google/common/base/MoreObjects
环境:jdk1.8 开发工具:IDEA 说明:今天在做springboot集成swagger2的时候,在启动程序的时候,报错 报错信息: Error starting ApplicationConte ...
- 浏览器启动不起来java.lang.NoClassDefFoundError: com/google/common/base/Function
java.lang.NoClassDefFoundError: com/google/common/base/Function 原因:只有以下两个包 解决方案:导入 selenium-server-s ...
- Java 上传文件到 SFTP 抛异常 java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC 的解决办法
最近从 Op 那里报来一个问题,说是SFTP上传文件不成功.拿到的 Exception 如下: Caused by: java.lang.NoClassDefFoundError: Could not ...
- Java异常 —— java.lang.NoClassDefFoundError
一直使用 Eclipse 来开发 Java . 现学习 Maven,在 cmd 下使用 Java ,出现了这样的异常:Exception in thread "main" java ...
- 异常-----java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.core.KeyFactory
SSH 类库问题 java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer2009- ...
- springboot 整合 CXF 版本异常 java.lang.NoClassDefFoundError:ServletRegistrationBean
在使用SpringBoot 项目整合webservice组件 CXF的时候,在启动时,抛出异常如下,查阅资料初步判断为版本问题.升级到高版本后正常启动. cxf 刚开始使用版本 3.1.7 后更新为 ...
随机推荐
- 15 Python之内置函数
思维导图: https://www.processon.com/mindmap/5c10cb5ee4b0090a2c9db92f 1. 匿名函数统一的名字是:<lambda> 使用场景: ...
- 帝国cms 获取一条数据,但是从第二条开始获取
/*这里的1指的是获取一条数据,2指的是从第二条开始获取*/ [e:loop={"select * from phome_ecms_news where classid='2' limit ...
- 使用CSS设置背景图片,图片比较大,完全显示在一个DIV中
做的时候想要边框为比较好看的样式,需要UI切图并且放在div中,看起来会好看点 像这样的,我随便挑选了一个,UI帮我切图出来 需要把这个图片填到相应的div里面,但是很显然碰到一个问题,图片太大,而且 ...
- 大神的JS代码风格指南
js代码风格指南:1.缩进使用空格,不要用制表符2.必须用分号3.暂时不用ES6(modules)例如export和import命令4.不鼓励(不禁止)水平对齐5.少用var 都应该使用const或者 ...
- access注入
前面有自己总结详细的mysql注入,自己access注入碰到的比较少,虽然比较简单,但是这里做一个总结 union联合查询法: 因为union前后字段数相同,所以可以先用order by 22 使查询 ...
- spring-boot 启动图标修改-启动彩蛋
spring boot启动总会显示这样的图标,但是我想不一样 到网上找了一圈,恩,找到一个不错的,做个记录 首先我们在resource目录下面放入一个banner.txt文件,Spring Boot启 ...
- ZeroMQ 三种模式python3实现
ZeroMQ是一个消息队列网络库,实现网络常用技术封装.在C/S中实现了三种模式,这段时间用python简单实现了一下,感觉python虽然灵活.但是数据处理不如C++自由灵活. Request-Re ...
- window.location.href 与 window.location.href 的区别
- hadoop上hive的安装
1.前言 说明:安装hive前提是要先安装hadoop集群,并且hive只需要再hadoop的namenode节点集群里安装即可(需要再所有namenode上安装),可以不在datanode节点的机器 ...
- requests:用于发送http请求,专为人类设计
介绍 requests模块是一个专门用来发送http请求的模块 如何发送请求 import requests """ 使用requests模块发送请求非常简单 首先请求有 ...