请看以下功能:
import java.io.*; public class Try { public static void main(String args[]) { Try ob = new Try(); ob.func(); } void func() { BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt")); try { System.out.println(br.readLine()); } catch (Exception e) { System.out.println(e.getMessage()); } } }
在这种情况下,我们利用BufferedReader类的资源。如果方法br.readLine()引发异常(或者即使它没有引发异常),则BufferedReader类的资源将保持打开状态。在Java中,当不再需要所有资源时,关闭它们非常重要。一种实现方法是利用final块,在这里我们关闭了必要的资源。
import java.io.*; public class Try { public static void main(String args[]) { Try ob = new Try(); ob.func(); } void func() { BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt")); try { System.out.println(br.readLine()); } catch (Exception e) { System.out.println(e.getMessage()); } finally { if (br != null) br.close(); } } }
如果我们在try块中建立了与许多资源的连接,则需要在finally块中逐一关闭所有资源。Java 7和所有更高版本支持的另一种方法是使用try-with-resource块。
try-with-resource块的一般语法为:
try ( //在此处打开资源) { //在此处使用资源 } catch( //在此处捕获异常) { //在这里处理异常 } //资源自动关闭
在try-with-resource块中,所有资源都会自动关闭。我们可以捕获并最终将块与try-with-resource块一起使用。关闭资源后,将运行任何catch或finally块。我们可以在try-with-resource语句中打开多个资源,所有这些资源都必须实现Java.lang.AutoCloseable接口。资源以创建时的相反顺序关闭。
考虑对我们的代码进行以下更新:
import java.io.*; public class Try { public static void main(String args[]) { Try ob = new Try(); ob.func(); } void func() { try (BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"))) { System.out.println(br.readLine()); } catch (Exception e) { System.out.println(e.getMessage()); } } }
输出结果
C:\example.txt (No such file or directory)
无论try块是正常执行还是突然执行,BufferedReader资源都会自动关闭。
在试穿与资源有以下几个优点:
它使代码更易于阅读和解释
资源自动管理
我们不需要做一个finally块,尤其是关闭资源
可以在try-with-resource语句中打开多个资源,以分号分隔
资源以相反的顺序关闭,以避免任何依赖性问题
import java.io.*; public class Try { public static void main(String args[]) { Try ob = new Try(); ob.func(); } void func() { try (FileInputStream fin = new FileInputStream("file.txt"); BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"))) { System.out.println(br.readLine()); } catch (Exception e) { System.out.println(e.getMessage()); } } }
输出结果
file.txt (No such file or directory)
注意:这些程序中的输出引发异常,因为它们引用的是该路径中不存在的文件。