gpt4 book ai didi

java - 当 try 和 finally block 都抛出异常时 try-catch-finally block 的行为?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:36:01 26 4
gpt4 key购买 nike

static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}

如果方法 readLine 和 close 都抛出异常,那么方法 readFirstLineFromFileWithFinallyBlock 抛出 finally block 抛出的异常;从 try block 抛出的异常被抑制。为什么会有这样的行为?为什么 try block 的异常被抑制了?

最佳答案

只有 try 部分的异常才会被处理。此之外的任何内容(包括 finally 部分均未包含在 try 中,因此不会处理异常。

如果你想捕获/抑制 finally block 中的异常,你需要用它包装 if (br != null) br.close();自己的 try/catch block ,像这样:

...
} finally {
try {
if (br != null) br.close();
} catch (Exception e) {
// whatever handling
}
}
...

此外,来自 try block 的异常被抑制,因为这是 try block 的行为 - 尝试一些事情并给你一个恢复的机会。由于您在 try block 之后没有捕捉到任何异常,因此不会运行任何代码来响应它。

然后,无论是否抛出任何异常,finally block 都会被执行。如果它抛出一个异常,并且因为它不在它自己的 try/catch block 中,它的异常会传播到方法之外,并传播到调用方法。

以您下面的评论为例,从 Java 7 开始,您需要引用 the documentation outlined here ,并关注倒数第二个标题为“抑制异常”的部分,它基本上表示可以从 try block 中抛出多个异常,每个声明的资源最多 一个异常。

至于如果资源声明本身抛出异常会发生什么,我没有安装 JDK7,所以我不确定。为什么不把下面的代码放在一个测试项目中(就像它看起来的那样,带有伪造的路径),看看会发生什么,然后告诉我们结果是什么,这对每个人都有好处:

try (BufferedReader br = new BufferedReader(new FileReader("a totally invalid path"))) {
return br.readLine();
}

关于java - 当 try 和 finally block 都抛出异常时 try-catch-finally block 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7758681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com