JDK7之try-with-resources异常处理

异常

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哈哈~
这是一个有趣的异常!


    ×××××演示程序到此结束×××××
        门和窗户都被关闭了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值