java.lang.NoClassDefFoundError: Could not initialize class XXX

场景:本地能跑通的程序,一放到服务器就报NoClassDefFoundError错误。查了相关资料,最终解决了这个问题,为了避免下次入坑,就写了这篇博客。

问题说明与解决

这个问题一般是因为运行时,JVM加载类的static块或初始化static成员变量(log日志等)时抛出异常,为了得到异常的详细信息,在static块里加入try-catch,输出异常信息:

static {
        try{
            doSomething...
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getCause() + " - "+ e.getMessage());
        }
    }

观察异常信息,基本就可以定位问题了。

这里罗列下可能出现的问题:
- 引入的jar包冲突
- 缺少依赖的jar包
- static块读取文件时路径错误/缺少文件/读取格式错误导致乱码/其他IO异常等,使得类加载不成功
- static块抛出其他异常
- static成员变量初始化抛出异常
- 其他

NoClassDefFoundError和ClassNotFoundException区别

个人觉得弄清楚NoClassDefFoundError和ClassNotFoundException的概念是非常有必要的,于是就拷贝了博客:怎么解决java.lang.NoClassDefFoundError错误的部分内容,以下是原文:

我们经常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError这两个错误迷惑不清,尽管他们都与Java classpath有关,但是他们完全不同。NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。而如果你在J2EE的环境下工作,并且得到NoClassDefFoundError的异常,而且对应的错误的类是确实存在的,这说明这个类对于类加载器来说,可能是不可见的。

这篇博客有更为详细的分析和说明,以及NoClassDefFoundError的解决示例。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值