NoClassDefFoundError 经常与ClassNotfoundException混淆,ClassNotfoundException意为未找到类,即类丢失。而NoClassDefFoundError 意为未找到class的定义,即类还在,但是类的定义不在了,这个异常编译时不会报错,在运行过程中需要加载类的时候,该类却加载不成功导致。
经典重现1:需要外部引用的变量被定义为static
最常出现这种异常的类一般都包含有static方法或变量,由于jvm的类加载机制(此处不深入谈类加载了),static变量在类初始化时先被加载,但是static的初始化有可能失败,比如我前两天就遇到一个这样的问题
系统需要从外部加载file,该file的路径依据不同的操作系统会放在不同的位置,比如os为windows,那么放在c:\,如果os为linux或Unix,则放在/home文件夹下,然后我将filepath赋了一个默认值,默认放在c:\下,
伪代码展示:
public static filePath=“c:\” ;
if(os Linux){filePath=\home}
此后若在linux里调用包含filePath变量的方法就会出NoClassDefFoundError的异常
所以一般建议filePath这种需要调用外部定义的变量,尽量不要用static去修饰。
经典重现2:new 实例,实体类却被删除了
例如:Student 类创建打包的时候都还在,后来无意被人在jar包中删掉了,
在调用new Student()的时候就会出NoClassDefFoundError的异常。
网上经常拿经典重现2做例子,但是实际生产环境和项目中最容易出问题的往往是经典重现1。
尽信书不如无书,实践才是检验真理的唯一标准。
以上。