初始化包含抛出Exception方法的Java类时出现ClassNotFoundException问题求助
问题根因
你遇到的ClassNotFoundException并非MyClass本身缺失,而是JVM在加载MyClass的校验阶段,解析MyClass内部依赖的其他类型时失败,连带抛出的异常。
删除throw new Exception()后程序可正常运行的原因是:多数JVM实现会跳过对从未调用的方法的非必要符号引用校验,移除异常抛出逻辑后,JVM不会主动解析对应异常类型的引用,因此不会触发加载失败。
高发场景
- 同包存在自定义
Exception类,且该类未加入运行时类路径
如果你的当前代码包下定义了和java.lang.Exception重名的自定义异常类,代码未显式导入java.lang.Exception时会默认使用同包的自定义异常。如果运行时类路径中没有这个自定义异常的.class文件,JVM校验foo方法的异常逻辑时就会查找失败抛出异常。 - 运行在自定义类加载器的隔离环境
如果是在OSGi、Java 9+ JPMS模块化环境、Spring Boot Devtools热加载等使用自定义类加载器的场景下,类加载器的可见性配置错误时,会出现跨加载器无法访问对应类型的问题,解析异常类引用时就会失败。 - 增量编译不完整
IDE增量编译时可能出现只更新了Main.class,未正确生成最新的MyClass.class的情况,导致MyClass的字节码存在损坏或依赖缺失。
排查方案
- 检查当前包下是否存在自定义
Exception类,若存在要么将其加入运行类路径,要么显式指定使用JDK自带异常:throws java.lang.Exception、throw new java.lang.Exception()。 - 清理项目后执行全量编译,确认编译输出目录中同时存在
Main.class和MyClass.class两个文件,运行时类路径指向整个编译输出目录,而非单个.class文件。 - 确认编译和运行使用的JDK版本完全一致,避免高版本编译的字节码在低版本JDK上运行出现兼容问题。
- 如果使用了带自定义类加载器的框架,临时关闭热加载、模块化隔离配置后重试,确认是否是类加载器隔离规则导致的问题。
内容的提问来源于stack exchange,提问作者KingEze
相关产品推荐
相关产品推荐

