ClassNotFoundException 和 NoClassDefFoundError
ClassNotFoundException
ClassNotFoundException是一个运行时异常。从类继承层次上来看,ClassNotFoundException是从Exception继承的,所以ClassNotFoundException是一个检查异常。
当应用程序运行的过程中尝试使用类加载器去加载Class文件的时候,如果没有在classpath中查找到指定的类,就会抛出ClassNotFoundException。一般情况下,当我们使用Class.forName()或者ClassLoader.loadClass以及使用ClassLoader.findSystemClass()在运行时加载类的时候,如果类没有被找到,那么就会导致JVM抛出ClassNotFoundException。
NoClassDefFoundError
从类继承层次上看,NoClassDefFoundError是从Error继承的。和ClassNotFoundException相比,明显的一个区别是,NoClassDefFoundError并不需要应用程序去关心catch的问题。
当JVM在加载一个类的时候,如果这个类在编译时是可用的,但是在运行时找不到这个类的定义的时候,JVM就会抛出一个NoClassDefFoundError错误。比如当我们在new一个类的实例的时候,如果在运行是类找不到,则会抛出一个NoClassDefFoundError的错误。
总结
ClassNotFoundException | NoClassDefFoundError |
---|---|
继承自java.lang.Exceptioon,是一个Exception | 继承自java.lang.Error,是一个Error错误 |
动态加载时找不到会抛出该异常 | 编译成功后执行过程中找不到出现该错误 |
一般在执行Class.forName()、ClassLoader.loadClass()、ClassLoader.findSystemClass()的时候抛出 | jvm系统抛出 |