java7增强的try语句关闭资源
传统的关闭资源方式
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; class Student implements Serializable { private String name; public Student(String name) { this.name = name; } } public class test2 { public static void main(String[] args) throws Exception { Student s = new Student("WJY"); Student s2 = null; ObjectOutputStream oos = null; ObjectInputStream ois = null; try { //创建对象输出流 oos = new ObjectOutputStream(new FileOutputStream("b.bin")); //创建对象输入流 ois = new ObjectInputStream(new FileInputStream("b.bin")); //序列化java对象 oos.writeObject(s); oos.flush(); //反序列化java对象 s2 = (Student) ois.readObject(); } finally { //使用finally块回收资源 if (oos != null) { try { oos.close(); } catch (Exception ex) { ex.printStackTrace(); } } if (ois != null) { try { ois.close(); } catch (Exception ex) { ex.printStackTrace(); } } } } }
使用finally块来关闭物理资源,保证关闭操作总是会被执行。
关闭每个资源之前首先保证引用该资源的引用变量不为null。
为每一个物理资源使用单独的try...catch块来关闭资源,保证关闭资源时引发的异常不会影响其他资源的关闭。
以上方式导致finally块代码十分臃肿,程序的可读性降低。
java7增强的try语句关闭资源
为了解决以上传统方式的问题, Java7新增了自动关闭资源的try语句。它允许在try关键字后紧跟一对圆括号,里面可以声明、初始化一个或多个资源,此处的资源指的是那些必须在程序结束时显示关闭的资源(数据库连接、网络连接等),try语句会在该语句结束时自动关闭这些资源。
public class test2 { public static void main(String[] args) throws Exception { Student s = new Student("WJY"); Student s2 = null; try (//创建对象输出流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.bin")); //创建对象输入流 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.bin")); ) { //序列化java对象 oos.writeObject(s); oos.flush(); //反序列化java对象 s2 = (Student) ois.readObject(); } } }
自动关闭资源的try语句相当于包含了隐式的finally块(用于关闭资源),因此这个try语句可以既没有catch块,也没有finally块。
注意:
被自动关闭的资源必须实现Closeable或AutoCloseable接口。(Closeable是AutoCloseable的子接口,Closeeable接口里的close()方法声明抛出了IOException,;AutoCloseable接口里的close()方法声明抛出了Exception)
被关闭的资源必须放在try语句后的圆括号中声明、初始化。如果程序有需要自动关闭资源的try语句后可以带多个catch块和一个finally块。
Java7几乎把所有的“资源类”(包括文件IO的各种类,JDBC编程的Connection、Statement等接口……)进行了改写,改写后的资源类都实现了AutoCloseable或Closeable接口
以上这篇浅谈java7增强的try语句关闭资源就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
在此Java程序示例中: 当在静态方法example()的正文中抛出OutOfMemoryError错误时,在终止静态方法example()之前,连接“con”和语句“stmt”是否会自动关闭,尽管没有任何“cat”捕获这些错误,因此在main()的其余代码中,是否确定这两个对象已关闭? 谢谢
本文向大家介绍浅谈Python的条件判断语句if/else语句,包括了浅谈Python的条件判断语句if/else语句的使用技巧和注意事项,需要的朋友参考一下 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。 比如,输入用户的年龄,根据年龄打印不同的内容。。。 Python程序中,能让计算机自己作出判断的语句就是if语句: 例: 根据python的缩进规则,如果if语句的条件判断为Tr
考虑来自Java文档的以下代码。 根据Java文档, 在示例readFirstLineFromFile中,如果从try块和try with resources语句抛出异常,则方法readFirstLineFromFile抛出从try块抛出的异常;禁止从try with resources块引发的异常。 另一方面,也提到了 由于BufferedReader实例是在try with resource语
本文向大家介绍浅谈JavaScript异常处理语句,包括了浅谈JavaScript异常处理语句的使用技巧和注意事项,需要的朋友参考一下 程序运行过程中难免会出错,出错后的运行结果往往是不正确的,因此运行时出错的程序通常被强制中止。运行时的错误统称为异常,为了能在错误发生时得到一个处理的机会,JavaScript提供了异常处理语句。包含try-catch、try-catch-finally和thro
一本关于Java的初学者书中有以下代码。这本书也很好地解释了异常,并且由于我理解了异常是如何工作的,我得到了一个关于下面代码的问题。 由于某种原因,如果FileWriter类抛出异常,将不会被执行。因此,我认为关闭writer对象的最佳位置是在finally块中。甚至在此之前,我已经看到过许多这样编写的代码,其中资源将在try块本身中关闭。我认为这样做是没有意义的。只有在没有例外的情况下,资源才会
示例代码: 由于该文件不可用,将引发“FileNotFoundException”,并且无法初始化资源。 从Java SE7规范中,我理解了以下与“try with resources”语句相关的要点 如果资源初始化失败(即,其初始值设定项表达式引发异常),那么到目前为止由try-with-resources语句初始化的所有资源都将关闭。 仅当资源初始化为非空值时才关闭。 如果从try块和try-