请帮我理解ClassNotFoundException和NoClassDefFoundError

时间:2011-08-15 22:06:23

标签: java

有人可以帮助我理解ClassNotFoundExceptionNoClassDefFoundErrorNoClassDefFoundError有一个很好的例子)吗?

4 个答案:

答案 0 :(得分:2)

NoClassDefFoundError:“抛出Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分)并且没有找到类的定义。“这意味着它无法在被告知要搜索它们的目录中找到您的类(.class文件)。因此,如果你启动java并在包含另一个类的某个类上运行它,但是在启动java时你没有将该类放在-classpath选项指定的目录中,它将抛出此错误。

ClassNotFoundException:“当应用程序尝试使用以下字符串名称加载类时抛出:

Class类中的forName方法。 类ClassLoader中的findSystemClass方法。 类 ClassLoader 中的loadClass方法。

但是找不到具有指定名称的类的定义。 “由于ClassLoader抛出了NoClassDefFoundError,这可能是java的一个例子,”你所指的.class文件在哪里?“

答案 1 :(得分:1)

发生这种情况时的示例情况:

1)ClassNotFoundException

Class<?> c = Class.forName("NonExistentClass");

通常使用Reflection发生。对于可能发生这种情况的其他示例,您可以参考Javadocs中的“使用”标签。

2)NoClassDefFoundError

这意味着类加载器请求特定类的字节代码,但在当前类路径中的任何位置都找不到它。

示例:编译使用第二个库Jar代码的应用程序。编译应用程序后,删除第二个库并运行应用程序 - 您将获得此异常,告诉您Java无法找到第二个库的相应类。

答案 2 :(得分:0)

您可能已经知道它只是意味着JVM在尝试编译/运行时找不到您正在寻找的类。

现在的原因 - 最常见的原因是未正确配置类路径。如果您知道某个类存在并且您收到类似这样的错误,那么请重新检查您的类路径并确保在运行时包含构建目录而不是源。

希望有所帮助!

答案 3 :(得分:0)

错误和异常之间的区别由javadoc描述。

ClassNotFoundException

  

当应用程序尝试使用以下命令通过其字符串名称加载类时抛出:

     
      
  • 类Class中的forName方法。
  •   
  • ClassLoader类中的findSystemClass方法。
  •   
  • ClassLoader类中的loadClass方法。
  •   
     

但找不到具有指定名称的类的定义。“

要实现此目的,只需使用不存在的类名称调用Class.forName(...)


NoClassDefFoundError

  

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分)并且没有定义,则抛出可以找到班级。

     

在编译当前正在执行的类时存在搜索的类定义,但无法再找到该定义。

要实现这一目标:

  • 创建一个由入口点类(使用合适的main方法)和另一个类组成的应用程序。
  • 编译这两个类。
  • 删除第二个“.class”文件。
  • 使用java使用类路径上的第一个类运行应用程序。