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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章