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