ClassNotFoundException和NoClassDefFoundError有什么区别?

时间:2014-03-05 05:58:18

标签: java exception exception-handling

ClassNotFoundException和NoClassDefFoundError有什么区别?

任何人都可以通过一些例子来解释..

3 个答案:

答案 0 :(得分:6)

未找到班级:

http://docs.oracle.com/javase/7/docs/api/java/lang/ClassNotFoundException.html

No Class Def:

http://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError.html

“找不到类”是很明显的:一些反射机制试图引用它的类由它的名称的,但是类不在身边,所以kablooey。这很明显。这个名字错了。

偷偷摸摸的是“No Class Def Found”错误。当您编译代码时会发生这种情况。一切都是hunky-dorey,但在运行时,那个在编译时可用的类就不存在了。或者,更狡猾,它就在那里,但在错误的版本,所以它不能使用。

第一个问题指向配置错误。你的名字错了。

第二个问题指向构建错误。你已经从构建路径中丢失了一些东西,或者你在不同的JVM中运行,或者类似的东西。

“未找到课程”通常很容易修复,但“No Class Def”可以让你脱掉头发。如果您遇到后者,请设置证明所提到的类是在类路径上,还是在类路径的jar中。通常这种努力会在我看到它时解决问题。

答案 1 :(得分:2)

当在运行时对类的编译“硬”依赖性不满意时,抛出

NoClassDefFoundError。换句话说,在源代码中直接提到了一个类,它在编译时位于类路径上,但它在运行时不在类路径上。

当您尝试在运行时动态查找类并且无法找到它时,会抛出

ClassNotFoundException。在这种情况下,您的源代码中没有直接引用类名;相反,它被指定为一个字符串,您的应用程序可能从某个位置读取,如配置文件。它是Exception而不是Error,因为这种情况是应用程序可以合理恢复的情况 - 就像您尝试打开文件时获得的FileNotFoundException一样不存在。

这两种情况都可能是由运行时类路径中缺少某些内容引起的,但ClassNotFoundException也可能是由应用程序级配置问题引起的,导致应用程序尝试加载不应该加载的类。

答案 2 :(得分:0)

NoClassDefFoundException的主要原因是.class文件在文件系统/ JAR文件中的名称或位置错误,包含它所包含的类或编译时包含在其中的包语句。