java基础之连接关闭处理——try-with-resource代码块

try-with-resource——优雅的处理资源关闭问题
我们都知道,对于资源来的连接,比如数据库连接,文件输入输出流等,不管是正常执行完成还是在执行过程中出现了异常,都需要对我们使用的资源进行释放,在JAVA7以前,可以使用try-catch-finally/try-finally进行处理,finally就是不管try/try-catch中的逻辑是否正常走完,都会走入finally语句中,甚至是前面使用了return语句想跳出该方法执行逻辑都不行,finally中的代码块还是会执行的。所以finally中的语句块用来标记必须执行的代码片段,比如连接资源的释放,是再好不过的。
对于java7以及以后发布的版本,新增了try-with-resource这种代码书写格式,具体示例如下:

  public void readFile(String filePath) throws IOException {
        //直接在括号里面定义初始化对象即可
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }
    }


等效于try-catch-finally的格式(也就是java7以前,当然了7以后也可以使用这种格式):

      public void readFile(String filePath) throws IOException {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("file.txt"));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }  finally {
            if (br != null) {
                br.close();
            }
        }
    }


使用条件:
任何实现AutoClosable接口的类,当然了也包括Closable接口(Closable接口继承了AutoClosable)。

使用方式:
对于实现了AutoClosable接口的需要使用优雅自动关闭代码方式的,在try后面的括号中初始化该对象即可,多个可以使用分号(java中的分行符)隔开。
注意:在try后面的括号中,只能有对象的初始化代码,不能包含其它代码逻辑,否则编译不通过,是非法的代码格式,一般常用的IDE工具都能够提示出来。
多资源示例:

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"));
         BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"))) {
            //do something
 }


注意(NOTE)
try-with-resource也可以和try一起连着catch以及finally使用,但是在try-with-resource代码快中,catch或者finally中的代码块是在资源被关闭后才执行的。

有兴趣的可以看下官方文档https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
 

例子:

/**
 * @author zj
 * @version 1.0
 * @description try resource 例子
 * @create 2019/5/27 10:14
 **/
public class MyResource implements AutoCloseable {

    public static void main(String[] args) {
        try (MyResource mr = new MyResource();) {
            mr.doSomething();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
    }

    public void close() throws Exception {
        System.out.println("资源被关闭了!");
    }

    public void doSomething() {
        System.out.println("干活了!");
    }
}

结果:

干活了!
资源被关闭了!

转:https://blog.csdn.net/hexin13666113593/article/details/84548906

你可能感兴趣的:(java)