Java NoClassDefFoundError和ClassNotFoundException之间的区别?

Java NoClassDefFoundError和ClassNotFoundException之间的区别?,java,classloader,Java,Classloader,NoClassDefFoundError扩展了LinkageError,LinkageError反过来又扩展了错误 Javadoc用于错误类状态: Error是Throwable 这表明存在严重问题,合理应用 不应该试图抓住 类加载方法,如Class.forName()仅在throws子句中声明ClassNotFoundException。除了上面对Error的描述之外,这意味着在使用Class.forName()等加载类时,我们通常不应该捕获NoClassDefFoundError 我的问题是

NoClassDefFoundError扩展了LinkageError,LinkageError反过来又扩展了错误

Javadoc用于错误类状态:

Error
Throwable
这表明存在严重问题,合理应用 不应该试图抓住

类加载方法,如
Class.forName()
仅在throws子句中声明
ClassNotFoundException
。除了上面对
Error
的描述之外,这意味着在使用
Class.forName()
等加载类时,我们通常不应该捕获
NoClassDefFoundError


我的问题是,在手动加载类的情况下,抛出
NoClassDefFoundError
而不是
ClassNotFoundException
ClassNotFoundException
更有可能(向您的代码)抛出类,这正是针对
Class.forName()
。例如,这些名称可能来自用户输入

NoClassDefFoundError
当类文件本身引用一个无法找到的类时,将发生。这个类曾经出现过,但现在不是了——这不仅仅是试图进行反射的代码中的一个bug,它是一个部署错误,没有使所有必需的类都可用。据我所知,
NoClassDefFoundError
通常或可能总是会包装一个
ClassNotFoundException
——但问题是,这不是您的代码要防范的,因为它表明一个环境可能太坏而无法恢复


至少,这是我的理解:)

NoClassDefFoundError在运行时发生,因为编译器无法找到.class文件。

我在这里还发现了一个相关的讨论:关于这个问题,还有一个评分更高的问题,有更高评分的答案,但我觉得这个答案解释得更好,并且提供了其他人所缺乏的信息。(比如观察到NoClassDefFoundError似乎总是包装ClassNotFoundException,这让我清楚了很多关于这两个类的意图。)@Jon你能举一个实例说明类名何时来自用户输入吗?@Geek:你可以要求用户输入类名,然后使用
Class.forName
查找该类。@jonsket这在JavaEE应用程序中常见吗?我在找一个更实用的例子。@Geek:不,这不太常见。这只是文本数据的一个来源。另一个可能是用于依赖项注入的XML配置文件,例如Spring配置文件。