ClassNotFoundException 和 NoClassDefFoundError

275 阅读1分钟

前言

整理一下这两个报错

ClassNotFoundException

这是一个运行时异常,当类加载器去加载 Class 文件的时候,在 classpath 找不到指定类,就会抛出 ClassNotFoundExcpetion。 一般情况下,当我们使用Class.forName()或者ClassLoader.loadClass以及使用ClassLoader.findSystemClass()在运行时加载类的时候,如果类没有被找到,那么就会导致JVM抛出ClassNotFoundException。加载器调用的时候抛出。

NoClassDefFoundError

NoClassDefFoundError异常,看命名后缀是一个Error。从类继承层次上看,NoClassDefFoundError是从Error继承的。和ClassNotFoundException相比,明显的一个区别是,NoClassDefFoundError并不需要应用程序去关心catch的问题。当JVM在加载一个类的时候,如果这个类在编译时是可用的,但是在运行时找不到这个类的定义的时候,JVM就会抛出一个NoClassDefFoundError错误。比如当我们在new一个类的实例的时候,如果在运行是类找不到,则会抛出一个NoClassDefFoundError的错误。就是程序员承诺一定会有这个类文件,但是在使用的时候直接删掉文件。遇到这种问题时,程序一般都不能再继续了,也不能捕捉处理。JVM 运行时系统抛出。