Method.getExceptionTypes()仅返回显式声明的受检异常(继承Exception但非RuntimeException子类),不包含RuntimeException及其子类、Error,也无法捕获@SneakyThrows等绕过throws声明的异常。

在 Java 反射中,可以通过 Method 对象的 getExceptionTypes() 方法获取该方法声明抛出的异常列表(即 throws 子句中的异常类型)。
获取声明的受检异常类型
getExceptionTypes() 返回的是 Class<?>[],包含方法签名中显式声明的**所有异常类型**(包括受检异常和非受检异常),但不包含运行时实际可能抛出的未声明异常。
- 返回数组顺序与源码中
throws列表一致 - 若方法没写
throws,返回空数组(new Class[0]),不是null - 只反映编译期声明,不反映方法体内部实际 throw 的异常
示例代码
假设有如下类:
public class Service {
public void doWork() throws IOException, SQLException {}
public void safeMethod() {}
public void riskyMethod() throws RuntimeException {} // 非受检异常也可声明
}
反射获取方式:
立即学习“Java免费学习笔记(深入)”;
Method m1 = Service.class.getMethod("doWork");
Class<?>[] exceptions = m1.getExceptionTypes(); // [IOException.class, SQLException.class]
Method m2 = Service.class.getMethod("safeMethod");
Class<?>[] none = m2.getExceptionTypes(); // []
Method m3 = Service.class.getMethod("riskyMethod");
Class<?>[] runtime = m3.getExceptionTypes(); // [RuntimeException.class]
注意与 getGenericExceptionTypes() 的区别
如果方法声明了带泛型的异常(如 throws MyException<String>),应使用 getGenericExceptionTypes() 获取 Type[],才能保留泛型信息;getExceptionTypes() 会擦除泛型,只返回原始类型(如 MyException.class)。
- 日常处理受检异常检查时,用
getExceptionTypes()足够 - 需要精确泛型信息(如框架做泛型校验)才用
getGenericExceptionTypes()
常见用途
该能力常用于:
- 自定义注解处理器(如检查方法是否按规范声明了特定异常)
- RPC 框架生成客户端 stub,自动处理服务端声明的异常
- 测试工具分析方法契约,验证异常文档一致性
- IDE 插件实现 throws 提示或缺失警告


















