java的try-with-resource处理机制

1.描述

资源若实现Closeable或者AutoCloseable接口,则可以在try括号里创建,这样,就会自动调用close()方法去自动关闭资源。这就是try-with-resource机制

2.优点:若不采用机制我们通常需要finallly代码释放资源为了防止报错还要加上try-catch有时候 业务代码 没有 资源释放需要代码采用try-with-resource机制使得代码 变得更加简洁

Closeable继承自AutoCloseable接口,将close函数的Exception异常变为了IOException异常;

3.底层实现

try-with-resource是一种语法糖机制编译器最终实现通过编译可以看到编译器保证resourceclose调用到(在try代码最后以及catch里面调用close从而保证正常执行以及异常 都会调用close);

具体代码方便自己理解如下

import org.junit.jupiter.api.Test;

import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.IOException;

public class TryWithResourceTest {
    /***1.自定义资源 ****************************/
    public static class MyCloseResource implements Closeable {
        MyCloseResource() {
            System.out.println("【Closable】-创建");
        }
        @Override
        public void close() throws IOException {
            System.out.println("【Closable】-close");
            throw new IOException("【Closable】-关闭报错");
        }
    }

    @Test
    public void testClosable() {
        try (MyCloseResource r = new MyCloseResource()) {
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    // 反编译后----------
    @Test
    public void testClosable_1() {
        try {
            MyCloseResource r = new MyCloseResource();
            r.close();
        } catch (IOException var2) {
            throw new RuntimeException(var2);
        }
    }

    public static class MyAutoCloseResource implements AutoCloseable {
        MyAutoCloseResource() {
            System.out.println("【AutoCloseable】-创建");
        }
        @Override
        public void close() throws Exception {
            System.out.println("【AutoCloseable】-close");
            throw new Exception("【AutoCloseable】-关闭报错");
        }
    }

    @Test
    public void testAutoCloseable() {
        try (MyAutoCloseResource r = new MyAutoCloseResource()) {
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /****2.单个资源的额情况 *********************/
    @Test
    public void testReadFile2_1() {
        try (FileInputStream fis = new FileInputStream("/Users/data.txt")) {
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    @Test
    public void testReadFile2_11() {
        try {
            FileInputStream fis = new FileInputStream("/Users/data.txt");
            // 单个资源,会自动调用close
            fis.close();
        } catch (IOException var6) {
            throw new RuntimeException(var6);
        }
    }

    @Test
    public void testReadFile2_2() {
        try (FileInputStream fis = new FileInputStream("/Users/data.txt")) {
            // 多个一个输出,会多了一个try-catch代码块
            System.out.println("");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    @Test
    public void testReadFile2_21() {
        try {
            FileInputStream fis = new FileInputStream("/Users/data.txt");

            try {
                System.out.println("");
            } catch (Throwable var5) {
                try {
                    fis.close();
                } catch (Throwable var4) {
                    var5.addSuppressed(var4);
                }
                throw var5;
            }

            fis.close();
        } catch (IOException var6) {
            throw new RuntimeException(var6);
        }
    }



    /***3.多个复杂资源的情况 ****************************************/

    @Test
    public void testReadFile1() {
        try (FileInputStream fis = new FileInputStream("/Users/data.txt");
             BufferedInputStream bis = new BufferedInputStream(fis)) {
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Test
    public void testReadFile11() {
        try {
            FileInputStream fis = new FileInputStream("/Users/data.txt");
            try {
                BufferedInputStream bis = new BufferedInputStream(fis);
                // 会自动调用bis.close
                bis.close();
            } catch (Throwable var5) {
                // bis.close异常会调用这里
                try {
                    // 包在try-catch里面,是因为若是有异常,可以追加到原来的异常里面
                    fis.close();
                } catch (Throwable var4) {
                    var5.addSuppressed(var4);
                }

                throw var5;
            }
            // bis.close没有发生异常,会调用这里
            fis.close();
        } catch (IOException var6) {
            throw new RuntimeException(var6);
        }
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: try-with-resourceJava SE7中引入的一个新特性,它可以简化资源管理的代码,同时也能够确保程序在完成资源使用后,能够正确地关闭资源。 在使用try-with-resource语句时,需要将要使用的资源对象放在try关键字的括号中。这个资源对象必须是实现了java.lang.AutoCloseable接口的类的对象。在try语句块执行完毕后,不需要手动关闭资源对象,try-with-resource语句会自动调用资源对象的close()方法来关闭资源。这样可以避免忘记关闭资源或者错误地关闭资源所导致的问题。 下面是一个使用try-with-resource的例子,假设我们要读取一个文件的内容并打印出来: ``` try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { // handle exception } ``` 在这个例子中,我们使用了try-with-resource语句来创建一个BufferedReader对象,并在try语句块中使用它来读取文件的内容。当try语句块执行完毕后,程序会自动关闭BufferedReader对象。如果在读取文件的过程中发生了异常,程序也会正确地处理异常并关闭资源。 ### 回答2: try-with-resource 语句是Java 7中引入的一种语法结构,用于在处理资源时自动关闭资源。在传统的Java代码中,我们使用try-catch-finally语句来处理资源的释放,但这种方式很容易导致遗漏关闭资源的情况。而try-with-resource语句则可以更简洁地处理这个问题。 try-with-resource语句的语法如下: ```java try (resource declaration) { // code that might throw an exception } catch (exception type) { // exception handling code } ``` 在try-with-resource语句中,我们可以在try关键字后面的括号中声明资源,这个资源必须是实现了AutoCloseable接口的类的实例。当try块执行完毕后,不论是正常执行还是发生异常,系统会自动调用该资源的close()方法来关闭资源,无需显式编写关闭资源的代码。 这种语法的好处在于,无论代码是否抛出异常,资源都能正确关闭,避免了资源泄漏的问题。此外,由于资源的关闭由系统自动处理,代码也更简洁清晰。 需要注意的是,try-with-resource语句中可以声明多个资源,多个资源之间使用分号分隔。资源的声明顺序决定了关闭顺序,即先声明的资源会后关闭。 总结而言,try-with-resource语句是一种在处理资源时自动关闭资源的语法结构。它不仅可以减少代码量,更重要的是能够确保资源的正确关闭,保证代码的健壮性和可靠性。 ### 回答3: try-with-resourceJava中的一种异常处理机,用于自动关闭资源,确保资源正确关闭,同时减少了代码的冗余和异常处理的复杂性。 在Java 7中引入了try-with-resource语句,主要用于自动关闭实现了AutoCloseable接口的资源。使用try-with-resource语句能够简化资源关闭的代码,并且能够在try块执行完毕后自动关闭资源,不需要显式调用close方法。 try-with-resource语句的语法如下: try (资源初始化) { // 代码块 } catch (异常类型 异常对象) { // 异常处理 } finally { // 无需手动关闭资源 } 在try-with-resource语句中,资源的初始化在try关键字之后的括号中进行,可以同时初始化多个资源,多个资源之间使用分号分隔。 在执行try块里面的代码时,如果发生异常,会首先执行catch块中的异常处理代码,当catch块执行完毕后,会自动关闭初始化的资源,即使catch块中也发生了异常。而在try块里面如果没有发生异常,则会直接执行finally块中的代码,并在执行完毕后自动关闭资源。 使用try-with-resource语句可以有效地处理资源的关闭问题,避免资源泄漏和忘记手动关闭资源的情况发生。同时,由于try-with-resource语句能自动关闭资源,简化了代码的编写,更容易理解和维护。不过要注意,资源对象必须实现了AutoCloseable接口才能使用try-with-resource语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值