NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么?
本教程将介绍NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
NoClassDefFoundError
和ClassNotFoundException
有什么区别?
是什么导致它们被抛出?怎么解决?
在修改现有代码以包含新的 jar 文件时,我经常会遇到这些 throwable.对于通过 webstart 分发的 java 应用程序,我在客户端和服务器端都点击了它们.
我遇到的可能原因:
客户端代码的 build.xml
中未包含的包
我们正在使用的新 jar 缺少运行时类路径
版本与之前的 jar 冲突
当我今天遇到这些问题时,我会采取循序渐进的方法来让事情顺利进行.我需要更多的清晰和理解.
推荐答案
与Java API Specifications的区别如下.
对于 ClassNotFoundException
:
当应用程序尝试通过它的字符串加载一个类名称使用:
Class
类中的 forName
方法.
ClassLoader
类中的findSystemClass
方法.
ClassLoader
类中的loadClass
方法.
The forName
method in class Class
.
The findSystemClass
method in class ClassLoader
.
The loadClass
method in class ClassLoader
.
但没有定义类可以找到指定的名称.
对于 NoClassDefFoundError
:
如果 Java 虚拟机或ClassLoader
实例尝试加载在类的定义中(作为一部分正常的方法调用或作为使用 new 创建一个新实例表达式)并且没有定义可以找到类.
搜索到的类定义当前执行时存在类已编译,但定义再也找不到了.
所以,似乎NoClassDefFoundError
发生在成功编译源时,但在运行时,找不到所需的class
文件.这可能是在 JAR 文件的分发或生产中可能发生的事情,其中并未包含所有必需的 class
文件.
至于ClassNotFoundException
,看来它可能源于试图在运行时对类进行反射调用,但程序试图调用的类并不存在.
两者的区别在于,一个是Error
,一个是Exception
.NoClassDefFoundError
是一个 Error
,它是由 Java 虚拟机在查找它期望找到的类时遇到问题而引起的.由于未找到 class
文件,或者与在编译时生成或遇到的文件不同,因此预期在编译时工作的程序无法运行.这是一个非常严重的错误,因为程序无法由 JVM 启动.
另一方面,ClassNotFoundException
是一个Exception
,因此在某种程度上是可以预料的,并且是可以恢复的.使用反射可能容易出错(因为有些期望事情可能不会按预期进行.没有编译时检查以查看所有必需的类是否存在,因此查找所需类的任何问题都会在运行时出现.
好了关于NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。