中易网

ClassNotFoundException和NoClassDefFoundError的区别

答案:2  悬赏:0  
解决时间 2021-02-13 02:02
ClassNotFoundException和NoClassDefFoundError的区别
最佳答案
正如它们的名字所说明的:NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中错误和异常是有区别的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。

ClassNotFoundException的产生原因:

Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。

要解决这个问题很容易,唯一需要做的就是要确保所需的类连同它依赖的包存在于类路径中。当Class.forName被调用的时候,类加载器会查找
类路径中的类,如果找到了那么这个类就会被成功加载,如果没找到,那么就会抛出ClassNotFountException,除了
Class.forName,ClassLoader.loadClass、ClassLOader.findSystemClass在动态加载类到内存
中的时候也可能会抛出这个异常。

另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。

由于类的动态加载在某种程度上是被开发者所控制的,所以他可以选择catch这个异常然后采取相应的补救措施。有些程序可能希望忽略这个异常而采取其他方法。还有一些程序则会终止程序然后让用户再次尝试前做点事情。

NoClassDefFoundError产生的原因:

如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个错误往往是你使用new操作符来创建一个新的对象但却找不到该对象对应的类。这个时候就会导致NoClassDefFoundError.

由于NoClassDefFoundError是有JVM引起的,所以不应该尝试捕捉这个错误。

解决这个问题的办法就是:查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。

另:

ClassNotFoundException发生在装入阶段。
当应用程序试图通过类的字符串名称,使用常规的三种方法装入类,但却找不到指定名称的类定义时就抛出该异常。

NoClassDefFoundError: 当目前执行的类已经编译,但是找不到它的定义时

也就是说你如果编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误

加载时从外存储器找不到需要的class就出现ClassNotFoundException
连接时从内存找不到需要的class就出现NoClassDefFoundError

另:

NoClassDefFoundError 解决的三种方法:

1.
Simple example of NoClassDefFoundError is class belongs to a jar and
jar was not added into classpath or sometime jar’s name has been changed
by someone like in my case one of my colleague has changed tibco.jar into tibco_v3.jar and by program is failing with java.lang.NoClassDefFoundError and I was wondering what’s wrong.

首先是类在运行的时候依赖于其它的一个jar包,但是该jar包没有加载到classpath中或者是该jar包的名字被其他人改了,就像我的一个例子tibo.jar改为了tibco_v3.jar…….

2.
Class is not in Classpath, there is no sure shot way of knowing it but
many a times you can just have a look to print System.getproperty(”java.classpath“)and it will print the classpath from there you can at least get an idea of your actual runtime classpath.

运行的类不在classpath中,这个问题没有一个确定的方法去知道,但是很多时候你可以通过System.getproperty(”java.classpath“)方法,该方法能让你至少可以领略到实际存在的运行期间的classpath。

3.
Just try to run with explicitly -classpath option with the classpath
you think will work and if its working then it’s sure short sign that
some one is overriding java classpath.

试着通过-classpath命令明确指出你认为正确的classpath,如果能够正常执行的话就说明你使用的classpath是正确的,而系统中的classpath已经被修该过了。
全部回答
classnotfoundexception 和 noclassdeferror 的区别 解释下classnotfoundexception 和 noclassdeferror 两个异常,这也是在 classloader 加载类出现问题时常常碰到的两个异常。 这两个异常的区别在于:前者classnotfoundexception 是指通过 classloader 加载不到所需要的类;而后者noclassdeferror是指通过 classloader已经找到了所需要的类,但找不到该类所依赖的其他的类。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
2017年湖南教师资格证报名官网?
茗媛美容养生会所地址有知道的么?有点事想过
想知道:天津市 南开区限价房在哪?
辉南县教育学会地址在哪,我要去那里办事
脚心感觉到好像虫子在爬,难受死了是怎么?谢
人死了她的存折该怎么转入?死者的存折到期要
丰台区北大地附近哪个旅馆最便宜,有卫生间单
榴莲包子的做法,榴莲包子怎么做好吃,榴莲包
天兴美发美容在什么地方啊,我要过去处理事情
你好,报考事业单位审核没通过,资料填错了。
国足臭豆腐在什么地方啊,我要过去处理事情
北京燕郊新建了个新宏昌天马,谁知道从北京西
10.10.3系统支持HP1020 HP1022的驱动吗
雪佛兰新赛欧轮毂轮胎升级哪个型号
烧甲醇的取暖锅炉能用吗?地暖用烧甲醇的锅炉
推荐资讯
看到一个女生总不好意思,言行举止不自然,该
vb.net中使用Chart控件如何更改柱子宽度?
为什么在练车场练得还好,到考场看库怎么有点
靖远全兴轮胎经营部总经销地址在什么地方,想
推荐几款值得入手的ps4游戏单人双人的都行。
电动自行车车把僵硬
我想知道在广东,报关员,报检员,单证员,跟
伊芙嘉地址有知道的么?有点事想过去
晒干玫瑰花能做玫瑰酱吗wc
跟被人聊天。 打字了,按回车键发送后,就自
回送地址为什么是172.0.0.1?
金井职校乱吗,我就是报的金井
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?