try-with-resources和try-catch-finally之间的异常抑制的疑惑?

在查看某个关于语法糖的了解中,发现了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

如果理解说是在相同功能下,语法糖的写法会让代码更加简洁流畅,那么上述是不是已经改变了两者的功能?

阅读 2.6k
1 个回答

不要太过纠结,finally中抛出异常这种写法要避免,而当try-with-resource出现异常被抑制的问题时,你也能从异常堆栈信息中看出被抑制的异常。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题