当出现这个异常时,我的第一反应是,它跟ClassNotFoundException有什么不同。为了找到确切的答案我查看了它的api,
/*Thrown if the Java Virtual Machine or a ClassLoader instance
* tries to load in the definition of a class (as part of a normal method call
* or as part of creating a new instance using the new expression)
* and no definition of the class could be found.
*
* The searched-for class definition existed when the currently
* executing class was compiled, but the definition can no longer be
* found.
翻译过来就是,在调用方法或者new创建实例时,java虚拟机或者类加载器试图载入类定义,但是找不到类定义;编译当前执行类时,类是存在,但是现在找不到了;
分析
出了这个异常后,自然而然想到jar包中可能没有这个类,查看包中发现有这个类!如果没有这个类会抛出ClassNotFoundException;
继续深究,发现异常信息是java.lang.NoClassDefFoundError: could not initialize class:xxxxxx,自然而然想到java的类加载机制。
java类加载陆续经历,加载、验证、准备、解析、初始化等阶段,而上述异常表明是在初始化阶段出了问题。
在类的初始化阶段,执行方法(由编译器加入),它收集了静态代码块、静态变量赋值,收集顺序与源码中的顺序一致,执行完方法后,才完成类的加载。如果过程中出现错误,会导致类初始化失败。
基于这个原理,再回头看代码,发现类中的静态代码块中出现了异常,但是没有catch,导致出现异常。
解决方案
将static中的代码,try catch,并存入log,不妨碍类的加载,不然就会出现NoClassDefFoundError。
比如
static{ try{ //static initialize code }catch(Exception e){ } }
疑问
在tomcat启动中,只报出NoClassDefFoundError,没有具体原因;但在javase中有根本原因,猜测是tomcat类加载器catch了异常细节,只给出了上层异常信息;
JavaSE做的测试
public class A { static { boolean flag = true; if (flag) { throw new RuntimeException("初始化类失败"); } } public static void main(String[] args) { } }
控制台打印
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: 初始化类失败
at testmaven.test.A.<clinit>(A.java:8)
结论
再回过头来看NoClassDefFoundError的API说明,就能看懂了;
classnotfoundexception,是找不到类的二进制流,比如从jar中、网络中,找不到这个类;
NoClassDefFoundError,类路径中有类,由于加载时静态代码块或者静态变量出现异常导致。对静态代码块进行try catch处理。
---------------------
原文:https://blog.csdn.net/wangjun5159/article/details/52716679
相关推荐
java.lang.NoClassDefFoundError: de/javakaffee/kryoserializers/CurrencySerializer
jdk升级之后出现异常:java.lang.NoClassDefFoundError: javax/xml/ws/Service 1、解决方案jdk降级至1.8之前 2、由于JDK9以后,去除了javax.xml包需要引入对应的jar包 <groupId>javax.activation <artifactId>...
JavaMail的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误 原因: MyEclipse6.5的javaee.jar中的mail包与JavaMail包有冲突。 解决: 在MyEclipse目录下(D:\Program Files\MyEclipse ...
java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport异常处理
该jar包解决报错java.lang.NoClassDefFoundError: org/apache/james/mime4j/MimeException,亲测可用。
jdk升级jdk10后,原本jdk自带的 webservice一些包确实,引起的一系列错误解决方案
NULL 博文链接:https://lyndon-lin.iteye.com/blog/856002
jackson-annotations-2.10.2.jar jackson-core-2.10.2.jar jackson-databind-2.10.2.jar NoClassDefFoundError解决
NULL 博文链接:https://bijian1013.iteye.com/blog/2305804
NULL 博文链接:https://jaychang.iteye.com/blog/980159
NULL 博文链接:https://chen106106.iteye.com/blog/1596135
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 要在java里使用json用到的jar包怎么导入...
NULL 博文链接:https://lym6520.iteye.com/blog/310725
java解决Handler processing failed; nested exception is java.lang.NoClassDefFoundError
出现Exception in threadmain java.lang.NoClassDefFoundError的各种可能情况.doc
在jsp运行过程中,报错 java.lang.NoClassDefFoundError org.apache.xml.serializer.TreeWalker时的处理方法。
整个系统都没有错误,但是在发布运行后,控制台上却抛出了这样的异常: java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Message at com.bulktree.mail.SimpleMailTest.mail(SimpleMailTest.java:30) at com.bulktree.mail.SimpleMailTest.main(SimpleMailTest...