java closable_Java7,AutoClosable

Java 7的try-with-resource语法的目的是提高Java开发人员的效率,使得他们不需要在编写代码时考虑资源释放问题,大多数的这类"清理"问题是由于异常发生时清理方法没有被调用产生。

准备

3个异常:

class OpenException extendsException{}class SwingException extendsException{}class CloseException extends Exception{}

OpenDoor类

构造函数会抛出OpenException,swing()方法会抛出SwingException,close方法会抛出CloseException。

class OpenDoor implementsAutoCloseable {public OpenDoor() throwsException { System.out.println("The door is open.");//throw new OpenException()};public void swing() throwsException { System.out.println("The door is becoming unhinged.");//throw new SwingException();}public void close() throwsException { System.out.println("The door is closed.");//throw new CloseException();

}

}

可执行的TryWithResources类

public classTryWithResources {public static void main(String[] args) throwsException {try ( OpenDoor door = newOpenDoor() ) { door.swing(); }catch(Exception e) { System.out.println("Is there a draft? " + e.getClass());//注意e.getClass()}finally{ System.out.println("I'm putting a sweater on, regardless. "

);

}

}

}

运行上面的代码,如果没有抛出异常的话,输出应该是这样的:

The door is open. The door is becoming unhinged. The door is closed. I'm putting a sweater on, regardless.

三个异常目前被注释掉了,现在让我们一个个的抛出他们。

开始

在'try-with-resource'初始化代码块的异常(构造函数抛出)

如果OpenDoor的构造函数抛出异常时会发生什么?close()方法是否还会被自动调用?让我们来试一下就知道了,去掉构造函数中异常代码的注释:

public OpenDoor() throwsException { System.out.println("The door is open.");throw new

OpenException();

}

代码打印的结果如下:

The door is open. Is there a draft? classOpenException I'm putting a sweater on, regardless.

可以看到,当构造函数抛出异常时try-with-resource代码体部分的代码没有被执行。当声明资源时,如果有异常抛出,可以认为资源并未正确初始化,所以并需要释放资源。然而,需要注意的时,如果其他资源已被正确初始化,那么还是会按照声明相反的顺序调用那些资源的close()方法。

try-with-resource代码块中抛出的异常

如果在swing方法中抛出异常,会发生什么呢?

The door is open. The door is becoming unhinged. The door is closed. Is there a draft? classSwingException I'm putting a sweater on, regardless.

从上面的输出我们可以了解到:

OpenDoor的构造方法被调用了,第一行输出

OpenDoor的swing方法也被调用了,第二行输出

抛出了SwingException

close方法被调用,第四行输出

异常被catch块捕获,第五行输出

执行finally代码块,地六行输出。

只是try-with-resources代码块的标准行为,尽管会使人很困惑:什么时候会执行close方法?规则是:任何AutoCloseable对象的close方法会在任何catch块代码之前被执行。

在AutoCloseable对象的close方法中抛出异常

The door is open.

The door is becoming unhinged.

The door is closed.

Is there a draft? classCloseException

I'm putting a sweater on, regardless.

我是天王盖地虎的分割线

参考:http://www.4byte.cn/learning/84919/java-7-xin-te-xing-zi-dong-zi-yuan-guan-li-arm-he-autoclosable-jie-kou-jiao-cheng.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值