小C是一名特殊的黑客,他专门为黑客提供服务,扫除黑客攻击的痕迹,避免被查到为何人攻击。

今天他正兴致勃勃的玩游戏《连环清洁工》,连环清洁工是由iFun4all S.A.制作发行的一款犯罪题材动作冒险类游戏,故事剧情讲述的是一个专门山寨别人的杀手,专门模仿最近发生的大案要案,制造类似的凶杀案。游戏中玩家扮演一名专业凶案现场清扫人员,为客户处理尸体、清理血迹、隐藏凶器等犯罪证据,玩家接受任务的时候不能问任何问题。

突然接到小白请求帮助的紧急电话,注:小白是小C入侵小白的电脑后认识的,详情太多,参见详细地址https://cloud.tencent.com/developer/news/333203。

原来小白在学习java,碰到一个编程问题:文件操作关闭资源的时候会莫名其妙的报错。代码如下:

  1. public void openFile() throws IOException {
  2. FileReader reader = new FileReader("someFile");
  3. int i=0;
  4. while(i != -1){
  5. i = reader.read();
  6. System.out.println((char) i );
  7. }
  8. reader.close();
  9. System.out.println("--- File End ---");
  10. }

小C针对小白刚刚编程的经历,采用循循诱导的方式。

小C:上面的代码是不是没有捕获异常?是不是可以把异常捕获到,再分析异常原因?

小白:对哦,那我使用try 。。catch试试

  1. public void openFile(){
  2. try {
  3. // constructor may throw FileNotFoundException
  4. FileReader reader = new FileReader("someFile");
  5. int i=0;
  6. while(i != -1){
  7. //reader.read() may throw IOException
  8. i = reader.read();
  9. System.out.println((char) i );
  10. }
  11. reader.close();
  12. System.out.println("--- File End ---");
  13. } catch (FileNotFoundException e) {
  14. //do something clever with the exception
  15. } catch (IOException e) {
  16. //do something clever with the exception
  17. }
  18. }

小C:做的很不错,知道捕捉多重异常了!,资源的关闭是不是放到finally比较好?

小白:对哦,我看语法有这样的,那我重新写一下

  1. public void openFile() throws IOException {
  2. FileReader reader = null;
  3. try {
  4. reader = new FileReader("someFile");
  5. int i=0;
  6. while(i != -1){
  7. i = reader.read();
  8. System.out.println((char) i );
  9. }
  10. } catch (FileNotFoundException e) {
  11. //do something clever with the exception
  12. } catch (IOException e) {
  13. //do something clever with the exception
  14. }finally {
  15. reader.close();
  16. System.out.println("--- File End ---");
  17. }
  18. }

小白:哦,还忘掉reader的判断,再改一下:

  1. public void openFile() throws IOException {
  2. FileReader reader = null;
  3. try {
  4. reader = new FileReader("someFile");
  5. int i=0;
  6. while(i != -1){
  7. i = reader.read();
  8. System.out.println((char) i );
  9. }
  10. } catch (FileNotFoundException e) {
  11. //do something clever with the exception
  12. } catch (IOException e) {
  13. //do something clever with the exception
  14. }finally {
  15. if(reader != null){
  16. reader.close();
  17. }
  18. reader.close();
  19. System.out.println("--- File End ---");
  20. }
  21. }

小C:reader的关闭,是不是还有可能抛出异常,是不是还要捕获?

小白:是哦,我忘记了,修改后的是这样的吗?

  1. public void openFile() throws IOException {
  2. FileReader reader = null;
  3. try {
  4. reader = new FileReader("someFile");
  5. int i=0;
  6. while(i != -1){
  7. i = reader.read();
  8. System.out.println((char) i );
  9. }
  10. } catch (FileNotFoundException e) {
  11. //do something clever with the exception
  12. } catch (IOException e) {
  13. //do something clever with the exception
  14. }finally {
  15. if(reader != null){
  16. try {
  17. reader.close();
  18. } catch (IOException e) {
  19. //do something clever with the exception
  20. }
  21. }
  22. reader.close();
  23. System.out.println("--- File End ---");
  24. }
  25. }

小C:代码是不是太繁琐了?有没有更简洁的办法?让jvm帮你处理一些繁琐的工作?

小白:听说过ry-with-resources,但没有用过。

小C:那你看看这个是否简洁了一些呢?

  1. public void openFile() throws IOException {
  2. try (FileReader reader = new FileReader("someFile")){
  3. ;
  4. int i=0;
  5. while(i != -1){
  6. i = reader.read();
  7. System.out.println((char) i );
  8. }
  9. } catch (FileNotFoundException e) {
  10. //do something clever with the exception
  11. } catch (IOException e) {
  12. //do something clever with the exception
  13. }
  14. }

把资源放到try()内部, JVM会调用java.lang.AutoCloseable.close() 方法,自动关闭try()内部的资源。

小白:厉害,我学会了。

小C:那我考考你。

  1. public static void main(String[] args) {
  2. try {
  3. System.out.println("Hello world");
  4. return;
  5. } finally {
  6. System.out.println("Goodbye world");
  7. }
  8. }

这个会打印出什么结果?

小白:“hello world” 因为return 退出了,finally不能执行。

小C:不对,finally总是会执行的,打印

Hello world

Goodbye world

小白:我明白了,finally总是会执行的。

小C:那可不一定哦,看看这个:

  1. public static void main(String[] args) {
  2. try {
  3. System.out.println("Hello world");
  4. System.exit(0);
  5. } finally {
  6. System.out.println("Goodbye world");
  7. }
  8. }

小白:不是打印?

Hello world

Goodbye world

小C:不论try语句块的执行是正常地还是意外地结束,finally语句块确实都会执行。

然而在这个程序中,try 语句块根本就没有结束其执行过程。System.exit 方法

将停止当前线程和所有其他当场死亡的线程。finally 子句的出现并不能给予线

程继续去执行的特殊权限。

如果想要执行,想要使用hook

  1. public static void main(String[] args) {
  2. System.out.println("Hello world");
  3. Runtime.getRuntime().addShutdownHook(
  4. new Thread() {
  5. public void run() {
  6. System.out.println("Goodbye world");
  7. }
  8. });
  9. System.exit(0);
  10. }

小白:好神奇!

小C:学无止境,一起加油!今天到这里了,我还要继续我的游戏呢。

参考资料

【1】http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html

【2】https://howtodoinjava.com/java/exception-handling/try-catch-finally/

【3】https://howtodoinjava.com/java7/try-with-resources/

【4】java解惑

连环清洁工之特殊任务--java资源如何关闭?的更多相关文章

  1. try-with-resources 让java资源关闭代码更简洁

    一.JDK7的资源关闭方式优化 1 try-with-resource语法 在JDK7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resource语法,才实现了 ...

  2. Java利用ShutDownHook关闭系统资源

    Java关闭钩子 在Java程序中能够通过加入关闭钩子,实如今程序退出时关闭资源的功能. 使用Runtime.addShutdownHook(Thread hook)向JVM加入关闭钩子 public ...

  3. 基础篇:JAVA资源之IO、字符编码、URL和Spring.Resource

    目录 1 JAVA.IO字节流 2 JAVA.IO字符流 3 乱码问题和字符流 4 字符集和字符编码的概念区分 5 URI概念的简单介绍 6 URL概念及与URL的区别 7 Spring.Resour ...

  4. Java资源大全中文版(Awesome最新版)

    Awesome系列的Java资源整理.awesome-java 就是akullpp发起维护的Java资源列表,内容包括:构建工具.数据库.框架.模板.安全.代码分析.日志.第三方库.书籍.Java 站 ...

  5. Java资源大全中文版(Awesome最新版)(转载)

    原文地址:http://www.cnblogs.com/best/p/5876559.html 目录 业务流程管理套件 字节码操作 集群管理 代码分析 编译器生成工具 构建工具 外部配置工具 约束满足 ...

  6. java.sql.SQLException: 关闭的连接 解决办法

    程序如果长时间不进行数据库操作,那么数据源中的 Connection 很可能已经断开.其原因有可能是防火墙,或者连接的数据库设置的超时时间.这里使用的是 C3P0 连接 oracle 数据库,引起的异 ...

  7. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...

  8. Java资源大全中文版

    awesome-java-cn 是 Java 资源大全的中文版,包括开发库.开发工具.网站.博客等,将由伯乐在线持续更新. https://github.com/jobbole/awesome-jav ...

  9. spring+ibatis问题1—— 程序报错:java.sql.SQLException: Io 异常: Connection reset by peer, socket write error; ”或“java.sql.SQLException 关闭的连接”异常

    转自:http://blog.sina.com.cn/s/blog_1549fb0710102whz2.html spring+ibatis程序测试时报错:java.sql.SQLException: ...

随机推荐

  1. R 包 rgl 安装失败, 报错 X11 not found but required, configure aborted 及解决方法

    R 包 rgl 安装失败, X11 not found but required, configure aborted * installing *source* package ‘rgl’ ... ...

  2. HBase 系列(二)—— HBase 系统架构及数据结构

    一.基本概念 一个典型的 Hbase Table 表如下: 1.1 Row Key (行键) Row Key 是用来检索记录的主键.想要访问 HBase Table 中的数据,只有以下三种方式: 通过 ...

  3. Oracle面对“数据倾斜列使用绑定变量”场景的解决方案

    1.背景知识介绍 2.构造测试用例 3.场景测试 4.总结 1.背景知识介绍     我们知道,Oracle在传统的OLTP(在线事务处理)类系统中,强烈推荐使用绑定变量,这样可以有效的减少硬解析从而 ...

  4. net core天马行空系列:原生DI+AOP实现spring boot注解式编程

    写过spring boot之后,那种无处不在的注解让我非常喜欢,比如属性注入@autowire,配置值注入@value,声明式事物@Transactional等,都非常简洁优雅,那么我就在想,这些在n ...

  5. Scala 系列(九)—— 继承和特质

    一.继承 1.1 Scala中的继承结构 Scala 中继承关系如下图: Any 是整个继承关系的根节点: AnyRef 包含 Scala Classes 和 Java Classes,等价于 Jav ...

  6. python 35 多线程

    目录 多线程 1. 线程 2. 线程vs进程 3. 开启线程的两种方法. 4. 线程的特性 5. 线程的相关方法 6. join 阻塞 7. 守护线程 daemon 8. 互斥锁 多线程 1. 线程 ...

  7. Egret白鹭开发微信小游戏程序跳转功能(由一个小游戏跳转到另一个小游戏)

    假设我们要实现的功能是从小游戏A跳转到小游戏B 对于小游戏A: (1)在platform.ts中添加代码如下: /** * 平台数据接口. * 由于每款游戏通常需要发布到多个平台上,所以提取出一个统一 ...

  8. unity_UGUI养成之路01

    1.UGUI_UI之音量设计  2.控制音量音效的开关 实现开和关的互斥点击 实现开与关画面的显示 注意,上图并未选择分组.具体原因博主尚不清楚如果有知道的可以告知一二,谢谢各位!!! 代码: usi ...

  9. HDU 1517

    题意略. 思路: 我们分别来考虑n取到的各个区间,从而发现其中的规律: [2,9] 明显 Stan 必胜. 但是当n = 9 + 1时,Stan无论如何也不能取胜,并且此时,假设 Stan 取值 x ...

  10. 使用ansible对思科交换机备份

    先决条件 - 了解ansible基本操作 - 了解网络设备相关操作 - 了解linux相关操作 安装 安装EPEL yum install https://dl.fedoraproject.org/p ...