面试题答案
一键面试在try - with - resources
语句中,如果资源初始化和try
块内都抛出异常,最终抛出的是try
块内抛出的异常,而资源初始化抛出的异常会被抑制(suppressed)。
异常处理机制
- 资源初始化异常:当在
try - with - resources
语句中初始化资源时抛出异常,这个异常会被捕获并保存。 - try块异常:如果
try
块中也抛出异常,此时try
块抛出的异常会成为主要异常被抛出,而资源初始化抛出的异常会作为次要异常,以抑制异常(suppressed exception)的形式存在。
获取异常信息
- 获取try块异常:可以通过常规的
catch
块来捕获异常,例如:
try (SomeAutoCloseable resource = new SomeAutoCloseable()) {
// try块内代码,可能抛出异常
throw new RuntimeException("try块内异常");
} catch (Exception e) {
System.out.println("捕获到的异常: " + e.getMessage());
// 获取try块内抛出的异常信息
}
- 获取资源初始化异常:可以通过被捕获异常的
getSuppressed()
方法来获取抑制异常(即资源初始化异常),示例如下:
try (SomeAutoCloseable resource = new SomeAutoCloseable()) {
// try块内代码,可能抛出异常
throw new RuntimeException("try块内异常");
} catch (Exception e) {
System.out.println("捕获到的异常: " + e.getMessage());
Throwable[] suppressedExceptions = e.getSuppressed();
for (Throwable suppressed : suppressedExceptions) {
System.out.println("抑制异常: " + suppressed.getMessage());
// 获取资源初始化抛出的异常信息
}
}
在上述代码中,SomeAutoCloseable
是实现了AutoCloseable
接口的自定义资源类,在其构造函数中可能抛出资源初始化异常。getSuppressed()
方法返回一个Throwable
数组,包含了所有被抑制的异常。
注意,以上代码基于Java语言,不同编程语言在try - with - resources
类似机制上可能存在差异,但基本原理类似。