您的位置:首页 > 编程语言 > Java开发

java.lang.NoClassDefFoundError: Could not initialize class XXX

2017-03-15 10:39 591 查看
场景:本地能跑通的程序,一放到服务器就报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的解决示例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 异常 jvm
相关文章推荐