为何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
相关产品推荐
相关产品推荐

