java.lang.NoClassDefFoundError 和 java.lang.ClassNotFoundException 都是 Java 语言定义的标准异常。从异常类的名称看似乎都跟类的定义找不到有关,但是还是有些差异。我们先来看一下 java 规范中对这两个异常的说明:
java.lang.NoClassDefFoundError:
The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.
类加载器试图加载类的定义,但是找不到这个类的定义,而实际上这个类文件是存在的。
java.lang.ClassNotFoundException:
1. The forName method in class Class.
2. The findSystemClass method in class ClassLoader .
3. The loadClass method in class ClassLoader.
but no definition for the class with the specified name could be found.
从规范说明看, java.lang.ClassNotFoundException 异常抛出的根本原因是类文件找不到。
另外,从两个异常的定义看,java.lang.NoClassDefFoundError 是一种 unchecked exception(也称 runtime exception),而 java.lang.ClassNotFoundException 是一种 checked exception。(区分不了这两类异常?看这里 checked exception vs unchecked exception)
----------
有了前面的分析,我们知道这他们是两个完全不同的异常。但是如果在实际运行代码时碰到了其中一个,还是很容易被混淆成同一个,尤其是当事先没有留意到这两个异常的差别时。
就我个人而言,在这两个异常里,平时碰到最多的是 java.lang.ClassNotFoundException。从异常的名字看,很容易理解这个异常产生的原因是缺少了 .class 文件,比如少引了某个 jar,解决方法通常需要检查一下 classpath 下能不能找到包含缺失 .class 文件的 jar。
但是,很多人在碰到 java.lang.NoClassDefFoundError 异常时也会下意识的去检查是不是缺少了 .class 文件,比如 SO 上的这位提问者(java.lang.NoClassDefFoundError: Could not initialize class XXX)-- “明明 classpath 下有那个 jar 为什么还报这个异常“。而实际上,这个异常的来源根本不是因为缺少 .class 文件。而碰到这个异常的解决办法,一般需要检查这个类定义中的初始化部分(如类属性定义、static 块等)的代码是否有抛异常的可能,如果是 static 块,可以考虑在其中将异常捕获并打印堆栈等,或者直接在对类进行初始化调用(如 new Foobar())时作 try catch。
----------
前两天我也碰到了一个类似场景导致的 java.lang.NoClassDefFoundError: Could not initialize class xxx 异常,下面详细记录一下。
我定义了一个类,为了使用 log4j 打印日志,调用 org.slf4j.LoggerFactory 创建了一个 Logger,并作为类的 static 属性,除此之外无其他的成员属性,代码如下:
public class Foo { private static Logger logger = LoggerFactory.getLogger(Foo.class); // ... methods }
在另一个类里创建 Foo 实例:
public class Bar { public void someMethod() { Foo foo = new Foo(); // ... } }
在执行 new Foo() 时抛异常 java.lang.NoClassDefFoundError: Could not initialize class Foo。经过一番排查,这个异常最后的原因出在了 LoggerFactory.getLogger(Foo.class) 调用抛错,关于 这条语句为什么会抛错,我会在另一篇文章里详细描述,在这里只是简单的说下原因:由于 slf4j-api.jar 和 slf4j 的某个 binding jar 版本不兼容所致。
----
总结,记住他们是两个不同的异常类,在碰到具体某个异常时,从名字并联系它的 message 信息(如 "Could not initialize class ")就很容易锁定问题来源。
完。
相关推荐
NoClassDefFoundError 和 ClassNotFoundException 的区别是什么?try-catch-finally 中哪个部分可以省略?try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?类 ExampleA 继承 Exception,类 ...
java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport异常处理
6. **NoClassDefFoundError和ClassNotFoundException的区别**: - NoClassDefFoundError是运行时的Error,表明在运行时找不到类定义,可能由于类路径问题或类已被删除。 - ClassNotFoundException是受查异常,通常...
6. NoClassDefFoundError和ClassNotFoundException区别? 7. try-catch-finally中哪个部分可以省略? 8. try-catch-finally中,如果catch中return了,finally还会执行吗? 9. 类ExampleA继承Exception,类ExampleB...
在Java编程中,`java.lang.ClassNotFoundException` 是一个常见的运行时异常,通常发生在尝试通过类加载器加载指定类时,但找不到对应的字节码文件。在这个特定的问题中,`ClassNotFoundException` 引发的原因是缺少...
6. NoClassDefFoundError和ClassNotFoundException的区别在于:NoClassDefFoundError通常发生在运行时,原因是JVM无法找到某个类的定义,而这个类在编译时是存在的。而ClassNotFoundException通常发生在类被动态加载...
6. **NoClassDefFoundError 和 ClassNotFoundException**:前者是在运行时找不到类,后者是在类加载时找不到类。 7. **try-catch-finally**:finally通常是不能省略的,除非使用了`try-with-resource`。 **Java异常...
他们提供的见解有助亍理解和解决常见的 Java 异常,例如 NoClassDefFoundError 和 ClassNotFoundException,以及更有挅戓性的问题,例如类装入器约束迗反和死锁。在第 1 部分中,他们详细描述了 Java 类装入的工作...
当flink on yarn模式运行时,发生如下异常信息,需要将压缩包中的4个依赖jar包放入flink安装路径下的lib目录下。 Exception in thread "main" java.lang.NoClassDefFoundError: ...
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常...
在Java编程中,遇到“Exception in thread 'main' java.lang.NoClassDefFoundError”是一种常见的异常情况,这通常意味着JVM在运行时未能找到指定的类定义。此错误不同于ClassNotFoundException,后者发生在尝试加载...
6. NoClassDefFoundError 和 ClassNotFoundException 区别? 7. try-catch-finally 中哪个部分可以省略? 8. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 9. 类 ExampleA 继承 Exception...
### Java异常面试题知识点解析 #### 一、Java异常架构概览 - **Throwable**: Java中...以上就是关于Java异常的一些核心知识点和面试题解析。希望这些内容能够帮助到准备面试的朋友以及对Java异常处理感兴趣的学习者。
常见的编译时异常包括ClassNotFoundException和IOException等。 运行时异常是指在程序运行期间可能会发生的异常,它通常是由程序逻辑错误导致的。例如,NullPointerException、ArrayIndexOutOfBoundsException、...
- 编译时异常如`IOException`、`ClassNotFoundException`等,编译器会强制要求要么捕获处理,要么通过`throws`声明抛出。 3. 受检异常与非受检异常: - 受检异常是编译器强制要求处理的异常,如`IOException`。...
Java错误大全涵盖了从基础异常到特定开源框架如Hibernate和Struts中可能出现的异常情况。以下是一些关键知识点的详细说明: 1. **错误类型:**Java中的错误通常分为两种主要类型,异常(Exception)和错误(Error)...
当你看到 `NoClassDefFoundError` 而不是直接的 `ClassNotFoundException` 时,通常意味着类在编译时是可用的,但在运行时无法找到。这可能是因为在编译时使用的类库没有在运行环境中正确配置。 在本例中,问题出在...
在Java编程语言中,异常处理是确保代码健壯性和错误管理的关键部分。异常是指程序运行时出现的非正常情况,可以被预见到并处理,从而避免程序崩溃或产生不可预测的结果。Java中的异常分为两大类:受检异常(Checked ...