在查看某个关于语法糖的了解中,发现了try-with-resources和try-catch-finally两者都会有关于异常抑制的观点。理解如下
try-with-resources在java中实现例子并被反编译时,示例代码如下
public static void main(String[] args) {
try {
FileInputStream inputStream = new FileInputStream(new File("test"));
Throwable var2 = null;
try {
System.out.println(inputStream.read());
} catch (Throwable var12) {
var2 = var12;
throw var12;
} finally {
if (inputStream != null) {
if (var2 != null) {
try {
inputStream.close();
} catch (Throwable var11) {
var2.addSuppressed(var11);
}
} else {
inputStream.close();
}
}
}
} catch (IOException var14) {
throw new RuntimeException(var14.getMessage(), var14);
}
}
var2.addSuppressed(var11);
对外部资源进行处理(例如读或写)时,如果遭遇了异常,且在随后的关闭外部资源过程中,又遭遇了异常,那么你catch到的将会是对外部资源进行处理时遭遇的异常,关闭资源时遭遇的异常将被“抑制”但不是丢弃,通过异常的getSuppressed方法,可以提取出被抑制的异常。
也就是说catch中的异常会被处理,而关闭资源出现的异常会被压制(一般在try-catch-finally中的finally块关闭资源)。
而当初步了解try-catch-finally相关知识的时候,发现有finally中的异常会覆盖catch中的异常的说法,示例代码如下
try {
int a = 5/0;
return 1;
}catch(ArithmeticException amExp) {
throw new Exception("我将被忽略,因为下面的finally中抛出了新的异常");
}finally {
throw new Exception("我是finaly中的Exception");
}
我是finaly中的Exception
如果理解说是在相同功能下,语法糖的写法会让代码更加简洁流畅,那么上述是不是已经改变了两者的功能?
不要太过纠结,finally中抛出异常这种写法要避免,而当try-with-resource出现异常被抑制的问题时,你也能从异常堆栈信息中看出被抑制的异常。