ClassNotFoundException和NoClassDefFoundError的区别是什么?

📅 2026/8/9 12:14:14
ClassNotFoundException和NoClassDefFoundError的区别是什么?
ClassNotFoundException是一个受检异常checked exception。他通常在运行时在类加载阶段尝试加载类的过程中找不到类的定义时触发。通常是由Class.forName()或类加载器loadClass或者findSystemClass时在类路径中没有找到指定名称的类时会抛出该异常。表示所需的类在类路径中不存在。这通常是由于类名拼写错误或缺少依赖导致的。如以下方式加载JDBC驱动public class MainClass { public static void main(String[] args) { try { Class.forName(oracle.jdbc.driver.OracleDriver); }catch (ClassNotFoundException e) { e.printStackTrace(); } } }当我们的classpath中没有对应的jar包时就会抛出这个ClassNotFoundException。NoClassDefFoundError是一个错误error它表示运行时尝试加载一个类的定义时虽然找到了类文件但在加载、解析或链接类的过程中发生了问题。这通常是由于依赖问题或类定义文件.class文件损坏导致的。也就是说这个类在编译时存在运行时丢失了就会导致这个异常。如以下情况我们定义A类和B类class A { // some code } public class B { public static void main(String[] args) { A a new A(); } }在编译后会生成A.class和B.class当我们删除A.class之后单独运行B.class的时候就会发生NoClassDefFoundError扩展知识NoSuchMethodErrorNoSuchMethodError表示方法找不到他和NoClassDefFoundError类似都是编译期找得到运行期找不到了。这种error发生在生产环境中时通常来说大概率是发生了jar包冲突。