1、使用场景
针对 Java 中资源管理和异常管理的正确做法已经有了很好的文档说明。对于任何已成功初始
化的资源,都需要相应地调用它的 close() 方法。这就要求严格遵守 try/catch/finally 块的用法,以
确保任何从资源打开时起的执行路径最终都能调用一个方法来关闭资源。
编写正确的资源代码需要大量采用嵌套了 try/catch/finally 块的样板代码。 Java Platform,
Standard Edition (Java SE) 7 针对自动资源管理问题给出的解决办法,即 Coin 项目中提出的新语
言结构 try-with-resources 语句。
2、try-catch-finally方式
try{//try块中放可能发生异常的代码。//如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。//如果发生异常,则尝试去匹配catch块。
}catch(BizException bizException){//每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。
}catch(Exception exception){//...
}finally{ //finally块通常是可选的。//无论异常是否发生,异常是否匹配被处理,finally都会执行。//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}
注意:
- 如果同一个try块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,这样保证每个catch块都有存在的意义。
示例代码
public static void main(String[] args) {String filePath = "D://1/file.txt";File file = new File(filePath);BufferedReader br = null;FileReader fr = null;try {fr = new FileReader(file);br = new BufferedReader(fr);String line;while ((line = br.readLine()) != null) {// 处理每一行数据System.out.println(line);}} catch (IOException e) {log.info("main error:", e);} finally {if (fr != null) {try {fr.close();} catch (IOException e) {throw new RuntimeException(e);}}if (br != null) {try {br.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}
3、try-with-resources
使用 try-with-resources 来代替try-catch-finally。适用范围:
-
适用范围(资源的定义): 任何实现
java.lang.AutoCloseable
或者java.io.Closeable
的对象。 -
关闭资源和 final 的执行顺序: 在
try-with-resources
语句中,任何 catch 或 finally 块在声明的资源关闭后运行。
示例代码
public static void main(String[] args) {String filePath = "D://1/file.txt";File file = new File(filePath);try (BufferedReader br = new BufferedReader(new FileReader(file))) {String line;while ((line = br.readLine()) != null) {// 处理每一行数据System.out.println(line);}} catch (IOException e) {log.info("main error:", e);}
}
从上面可以看出比try-catch-finally代码清晰了很多。