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 {} // 非受检异常也可声明
}
反射获取方式:
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></string>),应使用 getGenericExceptionTypes() 获取 Type[],才能保留泛型信息;getExceptionTypes() 会擦除泛型,只返回原始类型(如 MyException.class)。
- 日常处理受检异常检查时,用
getExceptionTypes()足够 - 需要精确泛型信息(如框架做泛型校验)才用
getGenericExceptionTypes()
常见用途
该能力常用于:
- 自定义注解处理器(如检查方法是否按规范声明了特定异常)
- RPC 框架生成客户端 stub,自动处理服务端声明的异常
- 测试工具分析方法契约,验证异常文档一致性
- IDE 插件实现 throws 提示或缺失警告
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











