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

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

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

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

 public void openFile() throws IOException {FileReader reader = new FileReader("someFile");int i=0;while(i != -1){i = reader.read();System.out.println((char) i );}reader.close();System.out.println("--- File End ---");}

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

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

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

 public void openFile(){try {// constructor may throw FileNotFoundExceptionFileReader reader = new FileReader("someFile");int i=0;while(i != -1){//reader.read() may throw IOExceptioni = reader.read();System.out.println((char) i );}reader.close();System.out.println("--- File End ---");} catch (FileNotFoundException e) {//do something clever with the exception} catch (IOException e) {//do something clever with the exception
 }}

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

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

    public void openFile() throws IOException {FileReader reader = null;try {reader = new FileReader("someFile");int i=0;while(i != -1){i = reader.read();System.out.println((char) i );}}  catch (FileNotFoundException e) {//do something clever with the exception} catch (IOException e) {//do something clever with the exception}finally {reader.close();System.out.println("--- File End ---");}}

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

    public void openFile() throws IOException {FileReader reader = null;try {reader = new FileReader("someFile");int i=0;while(i != -1){i = reader.read();System.out.println((char) i );}}  catch (FileNotFoundException e) {//do something clever with the exception} catch (IOException e) {//do something clever with the exception}finally {if(reader != null){reader.close();}reader.close();System.out.println("--- File End ---");}}

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

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

    public void openFile() throws IOException {FileReader reader = null;try {reader = new FileReader("someFile");int i=0;while(i != -1){i = reader.read();System.out.println((char) i );}}  catch (FileNotFoundException e) {//do something clever with the exception} catch (IOException e) {//do something clever with the exception}finally {if(reader != null){try {reader.close();} catch (IOException e) {//do something clever with the exception
                }}reader.close();System.out.println("--- File End ---");}}

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

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

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

    public void openFile() throws IOException {try (FileReader reader = new FileReader("someFile")){;int i=0;while(i != -1){i = reader.read();System.out.println((char) i );}}  catch (FileNotFoundException e) {//do something clever with the exception} catch (IOException e) {//do something clever with the exception
        }}

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

小白:厉害,我学会了。

小C:那我考考你。

    public static void main(String[] args) {try {System.out.println("Hello world");return;} finally {System.out.println("Goodbye world");}}

这个会打印出什么结果?

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

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

Hello world

Goodbye world

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

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

    public static void main(String[] args) {try {System.out.println("Hello world");System.exit(0);} finally {System.out.println("Goodbye world");}}

小白:不是打印?

Hello world

Goodbye world

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

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

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

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

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

    public static void main(String[] args) {System.out.println("Hello world");Runtime.getRuntime().addShutdownHook(new Thread() {public void run() {System.out.println("Goodbye world");}});System.exit(0);}

小白:好神奇!

小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解惑

转载于:https://www.cnblogs.com/davidwang456/p/11566466.html

连环清洁工之特殊任务--java资源如何关闭?相关推荐

  1. java中logger关闭log_Log4J如何关闭Logger对象的IO流资源

    之前,在做一个项目时,客户要求在接口中对各个交易每天在monitor.trans.service三个目录下生成日志文件,monitor按日期生成文件碎片,trans每天按照日期生成一个目录,在该目录下 ...

  2. 资源不关闭,会导致什么最坏的结果

    JDK的原生资源类不关闭,它也不会永远存在.JVM会借助finalize自动关闭它,例如FileInputStream //FileInputStream.java - JDK8 //jdk8的Fil ...

  3. Java资源大全中文版(转)

    Java资源大全中文版(Awesome最新版) Awesome系列的Java资源整理.awesome-java 就是akullpp发起维护的Java资源列表,内容包括:构建工具.数据库.框架.模板.安 ...

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

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

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

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

  6. java 浏览器测试,【Java资源大全】Selenium:基于浏览器的测试套件

    (点击上方公号,可快速关注) 来源:http://hao.jobbole.com/ 作者:伯乐在线-唐尤华 Selenium是用于在多个平台上自动化操作浏览器的工具套件,支持多种浏览器.多种操作系统. ...

  7. 史诗级Java资源大全中文版

    本文来自GitHub 上 Awesome - java 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容包括:构建工具.数据库.框架.模板.安全.代 ...

  8. java pippo_【Java资源大全】Pippo:Java小型开源Web微框架

    (点击上方公号,可快速关注) Pippo是一个(基于Apache协议)的Java开源Web微框架,依赖关系精简.上手速度很快.这个项目的主要目的是用Java创建一个易于使用和修改的Web微框架.Pip ...

  9. Java资源大全中文版

    Java资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容 ...

最新文章

  1. KeyError: “None of [Int64Index([...],\n dtype=‘int64‘, length=739)] are in the [columns]“
  2. 一个简单的UBB程序
  3. python sql注入脚本_python打造一个分析网站SQL注入的脚本
  4. 系统工具源码设计页面
  5. 计算机信息导论论文,电子信息导论论文2000字
  6. PL/SQL包(Package)
  7. element 组件中 el-form-item label= ‘vue介绍 (vue设置)‘ 强制换行
  8. DE12 Continuation: General Theory for Inhomogeneous ODEs
  9. 树莓派搭建VSFTP记录---自用简记
  10. JEECG框架创建项目使用步骤
  11. openwrt php wifi 钓鱼,Openwrt自动扫描WiFi并连接中继
  12. matlab如何生存对称矩阵,如何使用Matlab产生对称矩阵
  13. Wordpress 优化小结 杜绝博客因为CPU 占用过高被封
  14. 苹果手机安兔兔压力测试软件,10款跑分软件压力测试(一)
  15. flask架设微信小程序服务器,苹果手机能正常访问,安卓不行(ssl的中间证书问题)
  16. c语言中char有无符号,char代表有符号还是无符号?
  17. EMQ压力测试及系统优化(单机11万并发连接)
  18. python学习之编写学员管理系统
  19. 仿支付宝头像外加一个边框的工具类
  20. 第三方支付机构和非银行支付机构的区别?第三方支付客户备付金介绍

热门文章

  1. 《剑指offer》c++版本 4.二维数组中的查找
  2. oracle数据库 spring,oracle spring 连接数据库 报错
  3. java中正则表达式函数_java正则表达式PHP中的正则表达式函数介绍
  4. 线程池框架_Java并发——Executor框架详解(Executor框架结构与框架成员)
  5. php事件和行为,Yii框架组件和事件行为管理详解
  6. 恒驰机器人_恒大汽车基地:2545台机器人为恒驰“效力”
  7. android+proguard目录,Android Proguard 详解
  8. matlab 连续显示,请教下MATLAB一个问题啊 我想检测一行数据里面出现连续出现0的次数,...
  9. android自动更新列表,Android数据库表结构自动升级
  10. html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)