JDK7之try-with-resources异常处理

来源:互联网 发布:淘宝宝贝详情图片宽度 编辑:程序博客网 时间:2024/06/04 00:30

异常

finally

  finally块是可选项。异常的产生往往会中断应用程序的执行,而在异常产生钱,可能有些资源未被释放。有时无论程序是否发生异常,都要执行一段代码,这时就可以通过finally块实现。无论异常产生与否finally块都会被执行。即使是使用了return语句,finally块也要被执行,除非catch块中调用了System.exit方法终止了程序的运行。

try-with-resources 语句

  Java程序中经常需要创建一些对象(I/O流、数据库连接),这些对象在使用完后需要关闭。忘记关闭文件可能导致内存泄露,并引起其他问题。在JDK7之前,通常使用finally语句来确保一定会调用close方法。

try {    // 打开资源} catch(Exception e) {    // TODO} finally {    // 关闭资源}

  如果在调用close方法也可能抛出异常,那么也要处理这种异常。这样编写的程序代码会变得冗长。例如,下面是打开一个数据库连接的典型代码:

Connection connection = nunll;try {    // 创建连接对象并执行操作} catch(Exception e) {    // TODO} finally {    if (connection != null) {        try {            connection.close();        } catch(SQLException e1) {            // TODO        }    }}

  可以看到,为了关闭连接资源要在finally块中写这些代码,如果在一个try块中打开多个资源,代码会更加的长。JDK7提供的自动关闭资源的功能为管理资源(如文件流、数据库连接等)提供了一种更加简便的方式。这种功能是通过一种新的try语句实现的,叫try-with-resources,有时称为自动资源管理。try-with-resources的主要好处是可以避免在资源(如文件流)不需要的时候忘记将其关闭。

try(resource-specification) {    // 使用资源}

  这里,resources-specification是声明并初始化资源(如文件)的语句,包含变量声明,用被管理对象的引用初始化该变量。这里可以创建多个资源,用分好分隔即可。当try块结束时,资源会自动释放。如果是文件,文件将被关闭,因此不需要显式调用close方法。try-with-resources语句也可以不包含catch语句和finally语句。

  并非所有的资源都可以自动关闭。只有实现了java.lang.AutoCloseable接口的那些资源才可以自动关闭。该接口是JDK7新增的,定义了close方法。java.io.Closeable接口继承了AutoCloseable接口。这两个接口被所有的流类实现,包括FileInputStreamFileOutputStream。因此,在使用流(文件流)时,可以使用try-with-resources语句。

演示程序

package com.company.Review;public class TryWithResources {    public static void main(String[] args) {        try (                Door door = new Door();                Window window = new Window()        ) {            door.open();            window.open();        } catch (Exception e) {            System.out.println("这是一个有趣的异常!");        } finally {            System.out.println("\n\n\t×××××演示程序到此结束×××××");            System.out.println("\t\t门和窗户都被关闭了");        }    }}class Door implements AutoCloseable {    public Door() {        System.out.println("创建门完成!");    }    public void open() throws Exception {        System.out.println("门已经被打开了,(⊙o⊙)…");        // 模拟发生异常        throw new Exception();    }    @Override    public void close() throws Exception {        System.out.println("门已经被关闭了,O(∩_∩)O哈哈~");    }}class Window implements AutoCloseable {    public Window() {        System.out.println("创建窗户完成!");    }    public void open() throws Exception {        System.out.println("窗户已经被打开了,(*@ο@*) 哇~");        // 模拟发生异常        throw new Exception();    }    @Override    public void close() throws Exception {        System.out.println("窗户已经被关闭了,;-)");    }}

  结果如下:

创建门完成!创建窗户完成!门已经被打开了,(⊙o⊙)…窗户已经被关闭了,;-)门已经被关闭了,O(∩_∩)O哈哈~这是一个有趣的异常!    ×××××演示程序到此结束×××××        门和窗户都被关闭了
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 乐扣保鲜盒密封圈有异味怎么办 8个月的宝宝不吃饭怎么办 宝宝十一个月了不爱吃饭怎么办 一岁八个月宝宝不爱吃饭怎么办 14个月的宝宝不爱吃饭怎么办 宝宝一岁多又黑又瘦又小该怎么办? 15个月宝宝偏瘦该怎么办 早期肺癌手术后身体瘦该怎么办 4个月婴儿的眼里有触摸糊怎么办 七个月宝宝断奶不喝奶粉怎么办 2个月的宝宝抓头怎么办 4岁宝宝吃东西一点都不认真怎么办 猫吐了白色黏液或泡沫怎么办 六个月的宝宝拉肚子老不好怎么办 小狗狗呕吐后拉肚子带血怎么办 八个月宝宝拉肚子拉出点血怎么办 在饿了么点外卖吃出虫子怎么办 1岁半宝宝拉肚子拉水怎么办 五个多月宝宝拉鼻涕便怎么办 一岁宝宝拉鼻涕样大便怎么办 宝宝拉粘液大便鼻涕状的怎么办 十个月宝宝拉鼻涕一样大便怎么办 7个月宝宝咳嗽反反复复发热怎么办 婴儿3个月突然不吃奶瓶怎么办? 2个月婴儿突然不肯用奶瓶怎么办 喝母乳的宝宝不喝奶瓶怎么办 三个月宝宝不喝奶瓶母乳不够怎么办 七个多月的宝宝不吃辅食怎么办 婴儿光认奶粉不认母乳怎么办 宝宝11个月断奶不吃奶瓶怎么办 4个月的宝宝断奶不肯吃奶瓶怎么办 晚上磨牙齿把牙神经磨坏怎么办 喝母乳的宝宝不喝奶粉怎么办 我宝宝的牙齿长的不整齐怎么办? 宝宝5个月了母乳不够吃怎么办 4个月宝宝母乳不够吃怎么办 11个月宝宝只吃母乳怎么办 10个月宝宝突然不吃母乳怎么办 2个月宝宝咳嗽怎么办是吃母乳的 九个月宝宝不喜欢吃粥和米糊怎么办 9个月宝宝突然不吃辅食怎么办