Java7,AutoClosable
Java 7的try-with-resource语法的目的是提高Java开发人员的效率,使得他们不需要在编写代码时考虑资源释放问题,大多数的这类"清理"问题是由于异常发生时清理方法没有被调用产生。
准备
- 3个异常:
class OpenException extends Exception{} class SwingException extends Exception{} class CloseException extends Exception{}
- OpenDoor类
构造函数会抛出OpenException,swing()方法会抛出SwingException,close方法会抛出CloseException。
class OpenDoor implements AutoCloseable { public OpenDoor() throws Exception { System.out.println("The door is open."); //throw new OpenException() }; public void swing() throws Exception { System.out.println("The door is becoming unhinged."); //throw new SwingException(); } public void close() throws Exception { System.out.println("The door is closed."); // throw new CloseException();
}
}
- 可执行的TryWithResources类
public class TryWithResources { public static void main(String[] args) throws Exception { try ( OpenDoor door = new OpenDoor() ) { 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() throws Exception { System.out.println("The door is open."); throw new
OpenException();
}
代码打印的结果如下:
The door is open. Is there a draft? class OpenException 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? class SwingException 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? class CloseException 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
作者:我爱物联网
出处:http://yydcdut.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yydcdut.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?