文档章节

ClassNotFoundException和NoClassDefFoundError

摆渡者
 摆渡者
发布于 2016/07/20 18:01
字数 569
阅读 169
收藏 5

定义:

对于术语的定义,最原汁原味的还是官方文档。

关于ClassNotFoundExceptionJavaDoc里这么描述:

Thrown when an application tries to load in a class through its string name using:

  • The forName method in class Class.
  • The findSystemClass method in class ClassLoader .
  • The loadClass method in class ClassLoader.

but no definition for the class with the specified name could be found.

关于NoClassDefFoundErrorJavaDoc里这么描述:

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.


样例:

如果只看官方定义,不容易明白(我就是这样的),看例子:

public class A {
	public static void main(String[] args) {
		try {
			B b = new B(); //NoClassDefFoundError
		} catch(Throwable e) {
			e.printStackTrace();
		}
		System.out.println("----------------------------");
		try {
			Class b = Class.forName("B");//ClassNotFoundException
		} catch (Throwable e) {
			e.printStackTrace();
		}
		System.out.println("----------------------------");
		try {
			ClassLoader loader = A.class.getClassLoader();
			loader.loadClass("B");//ClassNotFoundException
		} catch(Throwable e) {
			e.printStackTrace();
		}
	}
}

class B {
	
}

这里定义了两个类A和B,其中在A中的main方法中使用了B。

如果使用Eclipse工具编写这个类,编写完按下保存后,Eclipse会自动编译这两个类生成A.class和B.class。

如果使用cmd命令行,则需要手动编译这两个类。

接下来,我们把编译好的B.class手动删掉,之后再执行A的main方法:

可以看到,new B()这一句抛出了NoClassDefFoundError,而Class.forName("B")和ClassLoader.loadClass("B")这两句则抛出了ClassNotFoundException。

原因就是JavaDoc里提到的:当使用类名字符串去调用Class.forName等方法来加载一个类时,如果找不到这个类,则抛出ClassNotFoundException。如果JVM尝试去加载一个类(普通方法调用或者使用new关键字创建对象),而这个类又不存在时,则抛出NoClassDefFoundError。


区别:

一个是Error,一个是Exception。

通过类名,手动调用方法去加载不存在的类,抛出ClassNotFoundException;而如果是JVM调用方法加载不存在的类,抛出NoClassDefFoundError。


总结:

ClassNotFoundException :
Thrown when an application tries to load in a class through its name, but no definition for the class with the specified name could be found

NoClassDefFoundError :
Thrown if the Java Virtual Machine tries to load in the definition of a class and no definition of the class could be found.


参考:

http://stackoverflow.com/questions/1457863/what-causes-and-what-are-the-differences-between-noclassdeffounderror-and-classn

http://www.javaroots.com/2013/02/classnotfoundexception-vs.html

© 著作权归作者所有

摆渡者
粉丝 340
博文 171
码字总数 206342
作品 0
浦东
程序员
私信 提问
ClassNotFoundException和NoClassDefFoundError的区别

正如它们的名字所说明的:NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中错误和异常是有区别的,我们可以从异常中恢复程序但却不应该尝试从错误中恢...

一条大河波浪宽
2013/10/05
0
0
NoClassDefFoundError和ClassNotFoundException区别

很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException这两个错误搞混,事实上这两个错误是完全不同的。 NoClassDefFoundError错误发生的原因 NoClassDefFoundError错误...

_上善_若水_
2018/04/17
0
0
【eclipse】 怎么解决java.lang.NoClassDefFoundError错误

前言 在日常Java开 发中,我们经常碰到java.lang.NoClassDefFoundError这样的错误,需要花费很多时间去找错误的原因,具体是哪个类不见了?类 明明还在,为什么找不到?而且我们很容易把jav...

无信不立
2017/02/22
0
0
NoClassDefFoundError问题

问题: 遇到一个问题,报NoClassDefFoundError,如下图: NoClassDefFoundError和ClassNotFoundException区别 我们经常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundErro......

yysue
2018/05/31
0
0
java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别

  以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自己测试验证了一下。虽然网上说法很多,但是关于NoClassDefFoundError并没有给出一个样例,所以一直无法理解,索性自己验...

青夜之衫
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

趣谈预留实例券,一文搞懂云上省钱最新玩法

摘要: 一文搞懂时髦的预留实例券(RI) ECS近期推出了预留实例券(Reserved Instances),简称RI,这东西很cool,今天我们聊聊这个。 首先这篇Blog不是文档,读完后想详细了解文档的朋友请点...

zhaowei121
21分钟前
0
0
js 将json字符串转换为json对象的方法解析

js 将json字符串转换为json对象的方法解析 将json字符串转换为json对象的方法。在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之...

城市之雾
22分钟前
1
0
国外青少年最喜爱的聊天 app,竟然是 Google Docs

简评: 这还真不是标题党,Google Docs 的协作中内置了实时聊天的功能,也可以进行 comments,颇有种现代「传纸条」的既视感。其实国内的石墨文档、腾讯文档等协作工具也有类似的效果,本文很...

极光推送
27分钟前
0
0
用zuul将微服务的多个swagger api文档聚合成一个文档

1.在每个服务的pom中添加以下依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId></dependency> 注意:仅仅需要添加这个就行。zuul负......

xtof
27分钟前
0
0
为什么取不到metamask的账号?

当你使用Metamask测试以太坊DApp时,如果出现莫名其妙的问题,检查一下web3.eth.accounts是否可以获取到账户,如果不能获取的话,那么最大的可能是你使用了新版的Metamask,并且默认启用了隐...

汇智网教程
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部