getexceptiontypes()返回class[]数组,包含方法throws子句中声明的所有异常类型(含受检与非受检),按声明顺序排列;若无throws则返回空数组。

在 Java 反射中,可以通过 Method 对象的 getExceptionTypes() 方法获取该方法声明抛出的**所有受检异常(checked exceptions)类型**——注意,它返回的是所有 throws 子句中声明的异常类(包括受检和非受检),但**运行时异常(unchecked)通常不需强制处理,所以实际关注点往往落在受检异常上**。
getExceptionTypes() 返回什么?
getExceptionTypes() 返回一个 Class>[] 数组,包含该方法在源码中 throws 关键字后声明的每一个异常类型(按声明顺序)。它不区分受检/非受检,只是原样反映声明。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:
void foo() throws IOException, SQLException, RuntimeException→ 返回{IOException.class, SQLException.class, RuntimeException.class} - 即使
RuntimeException是非受检的,它也会出现在数组里 - 若方法没写
throws,则返回空数组(new Class[0]),不是null
如何只提取受检异常?
Java 中“受检异常”指:是 Exception 的子类,但**不是 RuntimeException 的子类**。因此需手动过滤:
- 遍历
method.getExceptionTypes()返回的数组 - 对每个
Class> exType,判断:Exception.class.isAssignableFrom(exType) && !RuntimeException.class.isAssignableFrom(exType) - 满足条件的即为受检异常类型
示例代码:
Method m = SomeClass.class.getMethod("someMethod");
Class>[] allExs = m.getExceptionTypes();
List<class>> checkedExs = Arrays.stream(allExs)
.filter(ex -> Exception.class.isAssignableFrom(ex)
&& !RuntimeException.class.isAssignableFrom(ex))
.collect(Collectors.toList());</class>
注意事项与常见误区
- 不反映实际运行时抛出的异常:它只读取编译期声明,无法得知方法体内部是否真的抛出、或通过反射/代理动态添加了异常
-
不包含
Error类型:即使方法声明throws OutOfMemoryError(极少这么做),它也会被返回,但Error不属于受检异常范畴 -
泛型擦除不影响此 API:异常类型是原始类(如
IOException),不带泛型参数,无需额外处理 -
访问权限无关:即使方法是
private,只要能拿到Method对象(如通过getDeclaredMethod并设setAccessible(true)),就能调用getExceptionTypes()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










