try-with-resources 是 Java 7 引入的一种特殊的 try 语句,允许在使用时,声明一个或多个资源。这些资源,会在 try-with-resources 语句结束时,自动被关闭。
在 try-with-resources 中使用的资源,必须实现 java.lang.AutoCloseable 接口。
try-with-resources 示例(引自 Java 文档):
static void readFile(String path) { try (BufferedReader br = new BufferedReader(new FileReader(path))) { br.readLine(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // Others } }示例说明:
(1) 资源对象作用域:资源对象 br 的作用域为 try block 范围,即 try 的 { } 之间,在 catch 和 finally block 中无法访问该变量。
(2) 自动关闭:当 try block 中的代码运行完毕,资源对象 br 会被自动关闭,无需调用 br.close() 方法。
(3) 优先关闭:资源对象会在进入 catch 和 finally 之前被自动关闭。
在 Java 7 之前,为了保证资源对象在使用后被关闭,通常将关闭操作写在 finally block 中。但是,在 finally block 中,我们又需要 try catch 关闭方法的异常。
示例:
static void readFile(String path) { BufferedReader br = null; try { br = new BufferedReader(new FileReader(path)); br.readLine(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } }由此可见,使用 try-with-resources 语句,可以简化我们的代码,同时,保证了资源对象一定会被关闭。
在 try-with-resources 中,允许同时定义多个资源,各资源之间用分号“;”分隔。
示例:
try ( BufferedReader br = new BufferedReader(new FileReader(path)); BufferedWriter bw = Files.newBufferedWriter(outputFilePath) ) { String str = br.readLine(); bw.write(str); } catch (IOException e) { e.printStackTrace(); }