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

问题:

NoClassDefFoundErrorClassNotFoundException之间有什么区别?
是什么导致他们被抛出?他们如何解决?
修改现有代码以包含新的jar文件时,我经常遇到这些可抛弃的东西。
我在客户端和服务器端打了一个通过webstart分发的java应用程序。
我遇到的可能原因:

  1. 客户端代码中不包含在build.xml中的程序包
  2. 我们正在使用的新jar,缺少运行时类路径
  3. 版本与以前的jar冲突

当我遇到这些今天,我采取一个错误的方式来使事情工作。我需要更加清晰和理解。

回答:

与Java API规范的区别如下。
对于ClassNotFoundException

当应用程序尝试通过其字符串名称加载到类中时抛出:
但是没有找到具有指定名称的类的定义。

对于NoClassDefFoundError

如果Java虚拟机或ClassLoader实例尝试在类的定义中加载(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分),则不会引发类的定义找到。
当编译当前正在执行的类时,搜索类定义存在,但不能再找到该定义。

所以,当源被成功编译时,似乎出现NoClassDefFoundError,但在运行时,找不到所需的class文件。这可能是在分发或生产JAR文件时可能发生的事情,其中​​不包括所有必需的class文件。
对于ClassNotFoundException,似乎可能源于尝试在运行时对类进行反射调用,但程序尝试调用的类不存在。
两者之间的区别在于一个是Error,另一个是Exception。使用NoClassDefFoundError是一个Error,它来自Java虚拟机在找到一个预期找到的类时遇到问题。预期在编译时工作的程序无法运行,因为没有找到class文件,或者与编译时生成或遇到的文件不同。这是一个非常关键的错误,因为程序无法由JVM启动。
另一方面,ClassNotFoundExceptionException,所以有些预期,是可以恢复的。使用反射可能是容易出错的(因为有一些期望,事情可能不会如预期的那样。没有编译时检查来看到所有必需的类都存在,所以找到所需类的任何问题都会在运行时出现。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What causes and what are the differences between NoClassDefFoundError and ClassNotFoundException?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

63 + = 69