描述:

  这个异常是在运行时抛出的,编译的时候没有任何问题,而且异常信息非常少,只有一句: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. 二维数组中的查找——牛客剑指offer

    题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...

  2. 利用Mocking Framework 单元测试Entity Framework

    一.前言 在实际编写程序时,往往需要与数据库打交道,在单元测试中直接使用数据库又显得太重,如果可以方便的编写一些测试数据,这样更易于检测功能.如何模拟数据库行为便是本篇的主题.微软有教程说明Moq E ...

  3. 剑指offer-数字在排序数组中出现的次数-数组-python

    题目描述 统计一个数字在排序数组中出现的次数.   python 内置函数 count()一行就能搞定   解题思路 二分查找到给定的数字及其坐标.以该坐标为中点,向前向后找到这个数字的 始 – 终 ...

  4. O015、OpenStack 架构

    参考https://www.cnblogs.com/CloudMan6/p/5340622.html   终于正式进入OpenStack 部分了.   今天开始正式学习OpenStack,OpenSt ...

  5. arcgisJs之底图切换插件

    arcgisJs之底图切换插件 底图切换插件在arcgis中有两种表现,如下: 1.两张底图切换 2.多张底图切换 一.两张地图切换 let basemapToggle = new BasemapTo ...

  6. TensorFlow入门——MNIST初探

    import tensorflow.examples.tutorials.mnist.input_data as input_data import tensorflow as tf mnist = ...

  7. python视频学习笔记5(高级变量的类型)

    知识点回顾: Python 中数据类型可以分为 **数字型** 和 **非数字型*** 数字型 * 整型 (`int`) * 浮点型(`float`) * 布尔型(`bool`) * 真 `True` ...

  8. Java中的字符串常量池,栈和堆的概念

    问题:String str = new String(“abc”),“abc”在内存中是怎么分配的?    答案是:堆内存.(Tips:jdk1.8 已经将字符串常量池放在堆内存区) 题目考查的为Ja ...

  9. linux命令详解——yum

    1.如果不知道确切名字可以:rpm -qa|grep pkgname 2.查看软件安装的文件:rpm -qpl pkgname 3.如果不知道提供某个软件的包是叫什么,可以使用类似下面的写法: yum ...

  10. Linux下putenv()函数导致composer更新失败

    bug复现: 原因: putenv() 函数设置特定的环境变量有可能是一个潜在的安全漏洞,所以这个函数在php配置文件中是默认禁止的,在 php.ini 中查找此函数,然后将此函数删除掉,重载配置即可 ...