当出现这个异常时,我的第一反应是,它跟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
java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport异常处理
JavaMail的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误 原因: MyEclipse6.5的javaee.jar中的mail包与JavaMail包有冲突。 解决: 在MyEclipse目录下(D:\Program Files\MyEclipse ...
该jar包解决报错java.lang.NoClassDefFoundError: org/apache/james/mime4j/MimeException,亲测可用。
标题 "java.lang.NoClassDefFoundError: javax/persistence/EntityListener" 提到的问题是一个常见的Java运行时异常,通常表示在类加载时找不到指定的类定义。这个错误在Java应用程序或Web应用中出现,可能是因为...
在Java开发过程中,我们经常会遇到`java.lang.NoClassDefFoundError`这个异常,尤其是在进行JDK版本升级时。这个错误通常表示在运行时找不到某个类的定义,即使编译时该类是可用的。在本例中,问题发生在从一个较低...
标题中的“JSON中,java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决”指的是一类常见的Java运行时错误,当尝试加载一个类时,如果Java虚拟机(JVM)找不到该类的定义,就会抛出`...
在Java编程中,`java.lang.NoClassDefFoundError` 是一个常见的运行时错误,它发生在类加载器尝试执行一个类,但在类路径中找不到该类的定义时。在这个特定的场景中,问题聚焦于 `net.sf.ezmorph.Morpher` 类。`...
jdk升级jdk10后,原本jdk自带的 webservice一些包确实,引起的一系列错误解决方案
NULL 博文链接:https://jaychang.iteye.com/blog/980159
jackson-annotations-2.10.2.jar jackson-core-2.10.2.jar jackson-databind-2.10.2.jar NoClassDefFoundError解决
在Java编程中,`java.lang.NoClassDefFoundError` 是一个常见的运行时异常,它发生在类加载器尝试加载一个在编译时存在但在运行时找不到的类定义时。这个错误通常意味着类路径设置不正确或者依赖项没有正确地被包含...
Java编程中的`java.lang.NoClassDefFoundError: org/jboss/logging/`是一个常见的运行时错误,通常发生在尝试执行一个类时,JVM无法找到在编译时已经存在的类定义。这个错误并不意味着类在编译期间不存在,而是表明...
在Java编程中,`java.lang.ClassNotFoundException` 是一个常见的运行时异常,通常发生在尝试通过类加载器加载指定类时,但找不到对应的字节码文件。在这个特定的问题中,`ClassNotFoundException` 引发的原因是缺少...
在Java编程中,遇到“Exception in thread 'main' java.lang.NoClassDefFoundError”是一种常见的异常情况,这通常意味着JVM在运行时未能找到指定的类定义。此错误不同于ClassNotFoundException,后者发生在尝试加载...
### Java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory #### 错误概述 在给定的日志片段中,出现了一个常见的Java运行时错误:“`java.lang.NoClassDefFoundError: org/apache/commons/...
在jsp运行过程中,报错 java.lang.NoClassDefFoundError org.apache.xml.serializer.TreeWalker时的处理方法。
java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 要在java里使用json用到的jar包怎么导入...