zoukankan      html  css  js  c++  java
  • 一个困扰很久的异常—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包。

  • 相关阅读:
    I4-6 Sports and Extreme Sports Teacher:Lamb
    English trip V2-B 24 Biographies Teacher: TAALAN
    git设置下载代理 http or socket5 设置方法
    The "Go" Learning Trip -- 0. Base build
    English trip V2-B 23 Making a Good Impression Teacher: GABRIELE
    English trip V2-B 22 Tell a Story Teacher: Russell
    English trip V2-B 21 Personal History Teacher: Russell
    English trip EM2- PE 5A COMMUNICATION 交流 Teacher:Corrine
    Phonics 自然拼读法 ou ow oi oy au aw oo oo ea Teacher:Lamb
    beta分布 java代码
  • 原文地址:https://www.cnblogs.com/lianliang/p/5970635.html
Copyright © 2011-2022 走看看