NoClassDefFoundError
和ClassNotFoundException
有什么区别?
是什么导致他们被扔的?如何解决这些问题?
在修改现有代码以包含新的JAR文件时,经常会遇到这些抛物面。
对于通过webstart发布的java应用程序,我在客户端和服务器端都对它们进行了测试。
我遇到的可能原因是:
代码客户端的build.xml
中未包含的包
我们正在使用的新jar缺少运行时类路径
版本与以前的jar冲突
当我今天遇到这些问题时,我会采取一种循序渐进的方法来解决问题。我需要更多的清晰和理解。
最佳答案
与Java API规范的区别如下。
对于ClassNotFoundException
:
当应用程序试图
通过类的字符串加载
名称使用:
类中的forName
方法。
类中的Class
方法。
类中的findSystemClass
方法。
但是没有定义
找不到指定的名称。
对于ClassLoader
:
如果Java虚拟机或
一个loadClass
实例试图加载
在类的定义中(作为一部分
普通方法调用的一部分
使用新实例创建新实例
表达式)没有定义
可以找到类。
搜索类定义
当当前执行时存在
类已编译,但定义
找不到了。
因此,ClassLoader
似乎是在成功编译源代码时发生的,但是在运行时,找不到所需的NoClassDefFoundError
文件。这可能是在JAR文件的分发或生产过程中发生的事情,其中并没有包括所有必需的ClassLoader
文件。
至于NoClassDefFoundError
,它可能源于在运行时试图对类进行反射调用,但是程序试图调用的类不存在。
两者之间的区别在于一个是class
,另一个是class
。WithClassNotFoundException
是一个Error
类,它源于Java虚拟机在查找预期要查找的类时遇到问题。由于未找到Exception
文件,或者与编译时生成或遇到的文件不同,预期在编译时工作的程序无法运行。这是一个相当严重的错误,因为程序不能由JVM启动。
另一方面,NoClassDefFoundError
是一个Error
,因此它在某种程度上是预期的,并且是可恢复的。使用反射可能容易出错(因为有些人认为事情可能不会如预期的那样发展)。没有编译时检查以查看所有必需的类存在,因此在运行时会出现任何发现所需类的问题。