JVM类加载过程中抛出的常见异常

1.ClassNotFoundException
 这是最常见的异常,产生这个异常的原因为在当前ClassLoader中加载类时未找到类文件,对于SystemClassLoader的类很容易
判断,只要加载的类不在Classpath中,而对位于User-DefinedClassLoader的类则麻烦些,要具体查看这个ClassLoader加载类的过程,才能判断此ClassLoader要从什么位置加载此类。

2.NoClassDefFoundError
该异常较之ClassNotFoundException更难处理一些,造成此异常的主要原因是加载的类中引用到的另外的类不存在,
例如要加载A,而A中调用了B,B不存在或当前ClassLoader没法加载B,就会抛出这个异常。
eg:
public class A{
         private B b = new B():
}

当采用Class.forName加载A时,虽能找到A.class,但此时B.class不存在,就会抛出NoClassDefFoundException。
因此,对于这个异常,须先查看是加载哪个类报出的,然后再确认该类中引用的类是否在于当前ClassLoader能加载到
的位置。

3.LinkageError
该异常在自定义的ClassLoader的情况下更容易出现,主要原因是此类已经在ClassLoader加载过了,重复地加载会造成
该异常,因此要注意避免在并发的情况下出现这种情况。
由于JVM的这个保护机制,使得JVM没有办法直接更新一个已经load的Class,只能创建一个新的ClassLoader来加载更
新的Class,然后将新的请求转入该ClassLoader中来获取类,这也是JVM中不好实现动态更新的原因之一,而其他更多
的原因对象状态的复制、依赖的设置等。


4.ClassCastException
该异常有多种原因,在JDK5支持泛型后,合理使用泛型可相对减少此异常的发生。这些原因中比较难查的是两个
A对象由不同的ClassLoader加载的情况,这时如果将某个A对象造型成另外一个A对象,会报ClassCastException。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值