NoClassDefFoundError和ClassNotFoundException之间的差异?

时间:2010-07-15 10:37:48

标签: java classloader

NoClassDefFoundError扩展了LinkageError,后者又扩展了Error。

Javadoc for Error类状态:

  

ErrorThrowable的子类     这表明合理应用存在严重问题     不应该试图抓住。

Class.forName()这样的类加载方法只在throws子句中声明ClassNotFoundException。除了以上对Error的描述之外,其他方式意味着在使用NoClassDefFoundError等加载类时,我们通常不应该抓住Class.forName()

我的问题是NoClassDefFoundError被抛出而不是ClassNotFoundException的条件是什么?

2 个答案:

答案 0 :(得分:12)

在您手动加载类的情况下,

ClassNotFoundException更有可能被抛出(您的代码) - 正是像Class.forName()这样的事情。例如,这些名称可能来自用户输入。

当类文件本身引用无法找到的类时,将发生

NoClassDefFoundError。类 出现在某个时间,但现在不是 - 这不仅仅是代码中的一个错误,它试图进行反射,这是一个部署错误,即没有使所有必需的类可用。据我所知,NoClassDefFoundError通常或可能总是包裹一个ClassNotFoundException - 但关键是这不是你的代码是为了防范,因为它表明一个可能太难以恢复的环境。

至少,这是我的理解:))

答案 1 :(得分:0)

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