猿问

NoClassDefFoundError和ClassNotFoundException之间的原因和

NoClassDefFoundError和ClassNotFoundException之间的原因和区别是什么?

.之间的区别是什么?NoClassDefFoundErrorClassNotFoundException?

是什么让他们被扔出去的?如何解决这些问题?

在修改现有代码以包含新的JAR文件时,我经常会遇到这些可移植性。我已经在客户端和服务器端为通过Webstart分发的java应用程序命中了它们。

我遇到的可能原因:

  1. 未包括在

    build.xml

    用于代码的客户端
  2. 我们正在使用的新JAR缺少运行时类路径
  3. 版本与以前的JAR冲突

当我今天遇到这些问题时,我会采取一种反复的方法来让事情正常运转。我需要更多的清晰和理解。


忽然笑
浏览 1383回答 4
4回答

手掌心

与JavaAPI规范的区别如下。为ClassNotFoundException:当应用程序试图通过其字符串名称加载类时引发:这个forName课堂方法Class.这个findSystemClass课堂方法ClassLoader.这个loadClass课堂方法ClassLoader.但是,无法找到具有指定名称的类的定义。为NoClassDefFoundError:如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分),因此无法找到该类的定义。编译当前执行的类时存在搜索类定义,但无法再找到该定义。所以,看来NoClassDefFoundError在成功编译源时发生,但在运行时,需要class没有找到文件。这可能是在JAR文件的分发或生产过程中发生的事情,在这种情况下,并不是所有必需的class文件包括在内。至于ClassNotFoundException,它看起来可能源于尝试在运行时对类进行反射调用,但是程序试图调用的类并不存在。两者的区别在于,其中一个是Error另一个是Exception。带着NoClassDefFoundError是Error这是因为Java虚拟机在查找它希望找到的类时遇到了问题。预期在编译时工作的程序无法运行,因为class未找到的文件,或与编译时生成或遇到的文件不同.这是一个非常严重的错误,因为程序不能由JVM启动。另一方面,ClassNotFoundException是Exception,因此,这是某种程度上的预期,是可以恢复的。使用反射是很容易出错的(因为有些人期望事情不会像预期的那样进行。)没有编译时检查以确保所有必需的类都存在,因此在找到所需的类时,任何问题都会在运行时出现。

蝴蝶刀刀

NoClassDefoundError基本上是一个链接错误。当您尝试并实例化一个对象时(静态地用“New”),在编译期间找不到它。ClassNotFoundException更通用,当您尝试使用不存在的类时,它是一个运行时异常。例如,函数中有一个参数接受一个接口,并且有人传入一个实现该接口的类,但是您不能访问这个类。它还包括动态类加载的情况,例如使用loadClass()或Class.forName()。
随时随地看视频慕课网APP

相关分类

Java
我要回答