描述:

  这个异常是在运行时抛出的,编译的时候没有任何问题,而且异常信息非常少,只有一句: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的更多相关文章

  1. 出现java.lang.NoClassDefFoundError: com/google/common/base/Charsets异常错误

    使用selenium,出现java.lang.NoClassDefFoundError: com/google/common/base/Charsets异常错误 原因:selenium-server- ...

  2. HBase中报错 java.lang.NoClassDefFoundError: com/google/protobuf/LiteralByteString

    Protobuf(全称 Protocol Buffers)是 Google 开发的一种数据描述语言,能够将结构化数据序列化,可用于数据存储.通信协议等方面.在 HBase 里面用使用了 Protobu ...

  3. Selenium 运行时出现错误(java.lang.NoClassDefFoundError: com/google/common/base/Function)

    已经写好了java脚本,点击运行的过程中如果出现如下的错误提示时: java.lang.NoClassDefFoundError: com/google/common/base/Function 问题 ...

  4. Caused by: java.lang.NoClassDefFoundError: com/google/common/base/MoreObjects

    环境:jdk1.8 开发工具:IDEA 说明:今天在做springboot集成swagger2的时候,在启动程序的时候,报错 报错信息: Error starting ApplicationConte ...

  5. 浏览器启动不起来java.lang.NoClassDefFoundError: com/google/common/base/Function

    java.lang.NoClassDefFoundError: com/google/common/base/Function 原因:只有以下两个包 解决方案:导入 selenium-server-s ...

  6. Java 上传文件到 SFTP 抛异常 java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC 的解决办法

    最近从 Op 那里报来一个问题,说是SFTP上传文件不成功.拿到的 Exception 如下: Caused by: java.lang.NoClassDefFoundError: Could not ...

  7. Java异常 —— java.lang.NoClassDefFoundError

    一直使用 Eclipse 来开发 Java . 现学习 Maven,在 cmd 下使用 Java ,出现了这样的异常:Exception in thread "main" java ...

  8. 异常-----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- ...

  9. springboot 整合 CXF 版本异常 java.lang.NoClassDefFoundError:ServletRegistrationBean

    在使用SpringBoot 项目整合webservice组件 CXF的时候,在启动时,抛出异常如下,查阅资料初步判断为版本问题.升级到高版本后正常启动. cxf 刚开始使用版本  3.1.7 后更新为 ...

随机推荐

  1. volatile关键字和transient关键字

    Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量 1.volatile 关键字-----针对变量的可变性 专业解释:volatile关键字是个类型修饰符用它声明的类型变 ...

  2. Redis 高可用之哨兵模式(二)

    上一篇实际操作过程中遇到两个问题 问题一:虽然运行了3个sentinel容器,实际上只有一个sentinel运行 问题出现的原因很简单,三个sentinel用的是同一个挂载配置文件,容器内部的更改直接 ...

  3. 一款完美代替微信小程序原生客服消息的工具:

    一.设置:无需开发,多种回复(自动+人工)   自动回复形式有3种: 打开客服消息(用户只要和客服互动过一次,再次点击进入,会收到设置好的自动回复) 关键词回复(用户在小程序中回复某个关键词内容时,会 ...

  4. vscode常用插件列表

    vscode插件 备注 Markdown PDF 把markdown文件转换成别的文件 Markdown TOC markdown文件目录生成 PHP Debug PHP调试 PHP Intenlli ...

  5. linux命令详解——ftp

    ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相信掌握了这些使用Linux 进行ft ...

  6. Delphi BitBtn组件

  7. 8.支撑向量机SVM

    1.什么是SVM 下面我们就来介绍一些SVM(Support Vector Machine),首先什么是SVM,它是做什么的?SVM,中文名是支撑向量机,既可以解决分类问题,也可以解决回归问题,我们来 ...

  8. Charles中使用Map Local提高测试效率

    书接上回,上次说到Charles中可以使用修改返回值来模拟接口返回,这次我们来说一下Charles中另外一个强大的功能. 我们用手机连接Charles,具体可以参考上一篇<借助Charles来测 ...

  9. Observer-Proxy拦截器 -ES6

    在目标对象前嫁接了一个拦截层,外界对该对象的访问都必须通过这层拦截 可实现观察者模式

  10. 通过实现接口runnable实现多线程

    实现Runnable接口实现多线程的步骤(1)编写类实现Runnable接口(2)实现run(方法(3)通过Thread类的start(方法启动线程 静态代理模式Thread >代理 角色MyR ...