您的位置:首页 > 其它

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

2011-09-29 22:22 507 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: