You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

初始化包含抛出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 21:48:03