Java基础恶补——ClassNotFoundException等类装入异常

--------------------------------------------------------------------------------------------------

学习: http://www.ibm.com/developerworks/cn/java/j-dclp2.html

--------------------------------------------------------------------------------------------------

 

要点

1. ClassNotFoundException

出现场合:当应用程序试图通过类的字符串名称,使用以下三种方法装入类,但却找不到指定名称的类定义时抛出该异常。

  • 类 Class 中的 forName() 方法。
  • 类 ClassLoader 中的 findSystemClass() 方法。
  • 类 ClassLoader 中的 loadClass() 方法。

修复方法:确保类路径正确。

 

2. NoClassDefFoundError

出现场合:如果 JVM 或 ClassLoader 实例试图装入类定义(作为正常的方法调用的一部分,或者作为使用 new 表达式创建新实例的一部分),但却没有找到类定义时抛出该异常。

修复方法:确保类存在。

 

3. ClassCastException

出现场合:该异常的抛出,表明代码企图把对象的类型转换成一个子类,而该对象并不是这个子类的实例。

修复方法:仔细检查对象要转换到的类型是否符合以下规则:

  • 对于普通对象(非数组):对象必须是目标类的实例或目标类的子类的实例。如果目标类是接口,那么会把它当作实现了该接口的一个子类。
  • 对于数组类型:目标类必须是数组类型或 java.lang.Object、java.lang.Cloneable 或 java.io.Serializable。

4. UnsatisfiedLinkError

出现场合:对于声明为 native 的方法,如果 Java 虚拟机找不到和它对应的本机语言定义,就会抛出该异常。

修复方法:把库放在合适位置:

  • 对于由 bootstrap 类装入器装入的类,搜索 sun.boot.library.path。
  • 对于由扩展类装入器装入的类,先搜索 java.ext.dirs,然后是 sun.boot.library.path,然后是 java.library.path。
  • 对于由系统类装入器装入的类,搜索 sun.boot.library.path,然后是 java.library.path。

5. ClassCircularityError

出现场合:类或接口由于是自己的超类或超接口而不能被装入。

修复方法:避免循环的类层次结构。

 

6. ClassFormatError

出现场合:负责指定所请求的编译类或接口的二进制数据形式有误。

修复方法:获得字节码的正确副本,可能需要重新进行编译。

 

7. ExceptionInInitializerError

出现场合:

  • 如果初始化器突然完成,抛出一些异常 E,而且 E 的类不是 Error 或者它的某个子类,那么就会创建 ExceptionInInitializerError 类的一个新实例,并用 E 作为参数,用这个实例代替 E。
  • 如果 JVM 试图创建类 ExceptionInInitializerError 的新实例,但是因为出现 Out-Of-Memory-Error 而无法创建新实例,那么就抛出 OutOfMemoryError 对象作为代替。

修复方法:检查造成 ExceptionInInitializerError 的异常(在堆栈跟踪的 Caused by: 下显示)并寻找阻止抛出这个异常的方式。

 

 

 

你可能感兴趣的:(java,jvm,虚拟机,ext,sun)