NoClassDefFoundError的产生及处理

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。

尽信书不如无书,实践才是检验真理的唯一标准。

以上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值