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

为何ClassNotFoundException无法被catch(Exception)捕获却能被catch(Throwable)捕获?

问题解析:为何catch(Exception)抓不到类找不到的异常,catch(Throwable)可以?

核心原因是:你遇到的不是ClassNotFoundException,而是NoClassDefFoundError,二者的继承链不同,导致捕获范围存在本质差异:

  • ClassNotFoundException 属于Exception的子类,是主动加载类(比如调用Class.forName()、ClassLoader.loadClass())时找不到目标类抛出的受检异常。
  • NoClassDefFoundError 属于Error的子类,是JVM在被动加载类(比如实例化对象、访问类的静态成员)时,发现此前尝试加载该类已失败(比如依赖jar未放在正确路径、类文件缺失),进而抛出的错误。

你在实例化Vector3D时触发的是JVM被动加载类的逻辑,此时抛出的是NoClassDefFoundError——它不在Exception的覆盖范围内,自然被catch(Exception)漏掉;而Throwable是所有异常和错误的顶层父类,所以catch(Throwable)能捕获到它。

验证方式

你可以在catch(Throwable)块里打印异常的具体类型,确认实际抛出的异常:

catch(Throwable t) {
    System.out.println("捕获到的异常类型:" + t.getClass().getName());
    t.printStackTrace();
}

输出大概率是java.lang.NoClassDefFoundError,而非ClassNotFoundException。

内容的提问来源于stack exchange,提问作者BF_PI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:35:58