首页 > 解决方案 > NoClassDefFoundError 总是由 ClassNotFoundException 引起的吗?

问题描述

我是否可以假设NoClassDefFoundError从 JDK 类加载机制中抛出的每个问题都将始终ClassNotFoundException作为堆栈跟踪的原因?

此外,实际NoClassDefFoundError抛出的位置及其原因被初始化为ClassNotFoundException?我找不到负责该逻辑的 Java 代码。

这就是我通常对堆栈跟踪的看法:

Exception in thread "main" java.lang.NoClassDefFoundError: package/Missing
    at package.Missing(Missing.java:110)
Caused by: java.lang.ClassNotFoundException: package.Missing
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

标签: javaclassloaderstack-tracenoclassdeffounderrorclassnotfoundexception

解决方案


我是否可以假设从 JDK 类加载机制抛出的每个 NoClassDefFoundError 将始终将 ClassNotFoundException 作为堆栈跟踪中的原因?

这是一个合理的假设。根据Java 虚拟机规范

如果 Java 虚拟机在验证(第 5.4.1 节)或解析(第 5.4.3 节)(但不是初始化(第 5.5 节))期间尝试加载类 C,以及用于启动 C 加载的类加载器抛出 ClassNotFoundException 的实例,那么 Java 虚拟机必须抛出 NoClassDefFoundError 的实例,其原因是 ClassNotFoundException 的实例。

我相信上面也回答了你的第二个问题。


推荐阅读