[Java] NoClassFoundException和NoClassDefFoundError

  最近出去面试的时候被问到这两者的区别, 当时就懵逼了,修习还不够,回巢慢慢进修吧。

   直奔正文吧.

    首先 最最基本的区别在于,NoClassFoundException是一个 非受检异常,它是一个 RuntimeException.  NoClassDefFoundError是一个错误。

    其次 所造成的原因也不同:

    造成 NoClassFoundException主要是在程序运行过程中,动态去加载类的时候,在ClassPath中找不到该类,于是就抛出NoClassFoundException,最常见的例子比如说,在使用JDBC编程的过程中使用Class.forName("Driver Name Here")的时候,如果并没有在classpath中添加相应的数据库驱动包,则会抛出NoClassFoundException异常,除此之外还有ClassLoader.loadClass和ClassLOader.findSystemClass在加载类时也可能抛出NoClassFoundException的异常。需要注意的是,还有一种会导致NoClassFoundException的原因是当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。在很多搭建框架的时候,出现包冲突的时候就会有此类问题,ClassPath里面会有同名的类。

    NoClassFoundException 在编译过程中, 编译器是不会发现此类错误的,往往是在程序运行时,加载器抛出的异常。

    造成NoClassDefFoundError的原因也比较晦涩, 当JVM或者类加载器 在加载类的时候找不到类定义。字面意思看上去有点难以理解, 比如说,当 程序 去 new 一个对象或者要import 类的时候 找不到该类,看似好像和NoClassFoundException差不多嘛,其实此类错误主要是,程序在编译过程中是通过编译,并且是有这个类的,到了运行环境的时候又没有这个类了,可能是把jar包删除了. 经常是在 maven 做构建的时候容易造成这种错误哦。

转载于:https://my.oschina.net/u/1041012/blog/607867

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值