try-with-resource

        try-with-resource是Java 7中引入的新特性,它可以方便地管理资源,自动关闭资源,从而避免了资源泄漏的问题。

作用 

        使用try-with-resource语句可以简化代码,避免了手动关闭资源的繁琐操作,同时还可以保证资源的正确关闭,避免了资源泄漏的问题。

语法结构

try (ResourceType resource = new ResourceType(args...)) {
    // 代码块
} catch (ExceptionType e) {
    // 异常处理
}

        在try关键字后面的括号中声明并初始化一个或多个资源。注意:【这些资源必须实现AutoCloseable接口,这个接口中只有一个方法close(),用于关闭资源】

 在代码块执行完毕之后,Java会自动调用这些资源的close()方法,释放资源。

示例

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

        在这个示例中,我们使用try-with-resource读取文件中的内容。try关键字后面的括号中声明了一个BufferedReader对象,它会自动关闭。在代码块中,我们使用readLine()方法读取文件的每一行,并打印出来。在catch块中捕获IOException异常,并输出错误信息。

底层

try-with-resources的语法形式类似于语法糖

编译器会将try-with-resources语句转换为普通的try-catch语句,并在finally块中自动调用资源的close()方法来关闭资源。

        try-with-resources的底层实现依赖于Java虚拟机的异常处理机制和字节码的异常表,通过自动调用资源的close()方法来确保资源被正确地关闭。

        1、Java编译器会将try块中的资源转换为一个虚拟的final变量,在try块结束时自动调用它们的close()方法来关闭资源。

        2、Java编译器为每个catch块生成一个异常处理器,并在字节码中的异常表中注册这些异常处理器。

        3、当try块中的代码执行时,如果发生异常,Java虚拟机会根据异常表中的信息查找匹配的异常处理器,并执行相应的操作。如果没有匹配的异常处理器,异常会被抛出到上一级调用者。

        4、当try块结束时,Java虚拟机会检查虚拟的final变量,并调用它们的close()方法。这个过程也会被包含在异常处理机制中,如果在关闭资源时发生异常,Java虚拟机会将这个异常封装到一个Suppressed异常中,并抛出到最终的异常处理器中。

注意:

AutoCloseable接口有个子接口——java.io.Closeableclose()方法不会抛出异常。

你可能感兴趣的:(#,Java新特性,java,resources)