在 Java 中,使用 try-with-resources 的情况下,资源会在 try 块执行完毕后自动关闭。具体来说,无论是否发生异常,资源总是在控制流进入 catch 或 finally 块之前关闭。
关键点:
- try-with-resources 是在
try语句中声明和管理实现了AutoCloseable接口的资源,例如InputStream、OutputStream、Connection等。 - 当
try块执行完毕后,无论是正常结束还是抛出异常,资源都会在进入catch或finally块之前自动关闭。 - 如果抛出了异常,资源的关闭操作会在
catch块之前进行。因此,当进入catch块时,资源已经被安全关闭了。
执行顺序:
- 正常执行:
try块中的代码执行完毕,资源被关闭,然后进入finally块(如果有)。 - 异常情况:当
try块中抛出异常,资源依然会在异常传播到catch块之前关闭。
示例代码:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
// 读取文件
String line = reader.readLine();
System.out.println(line);
// 假设这里发生了异常
throw new RuntimeException("Exception in try block");
} catch (Exception e) {
// 进入 catch 块之前,资源已经关闭
System.out.println("Exception caught: " + e.getMessage());
} finally {
System.out.println("Finally block executed");
}
}
}
执行流程:
try块中打开文件并读取一行。- 如果
try块中发生异常(例如throw new RuntimeException),BufferedReader会在异常抛出并传播到catch块之前被关闭。 - 异常被捕获后,进入
catch块处理异常。 - 最后执行
finally块。
输出:
Exception caught: Exception in try block
Finally block executed
说明:
- 当异常抛出时,资源
BufferedReader会在进入catch块之前被关闭。 - 即使
try块中没有异常,资源也会在try块执行完毕后关闭,然后再进入finally块。
总结:
- 资源总是在进入
catch块或finally块之前关闭,这意味着你不需要在catch或finally块中手动关闭资源。 - 这就是 try-with-resources 的优势,确保资源可以自动、安全地关闭,不论是否发生异常。










没有回复内容