连环清洁工之特殊任务--java资源如何关闭?
小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资源如何关闭?相关推荐
- java中logger关闭log_Log4J如何关闭Logger对象的IO流资源
之前,在做一个项目时,客户要求在接口中对各个交易每天在monitor.trans.service三个目录下生成日志文件,monitor按日期生成文件碎片,trans每天按照日期生成一个目录,在该目录下 ...
- 资源不关闭,会导致什么最坏的结果
JDK的原生资源类不关闭,它也不会永远存在.JVM会借助finalize自动关闭它,例如FileInputStream //FileInputStream.java - JDK8 //jdk8的Fil ...
- Java资源大全中文版(转)
Java资源大全中文版(Awesome最新版) Awesome系列的Java资源整理.awesome-java 就是akullpp发起维护的Java资源列表,内容包括:构建工具.数据库.框架.模板.安 ...
- Java利用ShutDownHook关闭系统资源
Java关闭钩子 在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源的功能. 使用Runtime.addShutdownHook(Thread hook)向JVM添加关闭钩子 public ...
- java.sql.SQLException: 关闭的连接 解决办法
程序如果长时间不进行数据库操作,那么数据源中的 Connection 很可能已经断开.其原因有可能是防火墙,或者连接的数据库设置的超时时间.这里使用的是 C3P0 连接 oracle 数据库,引起的异 ...
- java 浏览器测试,【Java资源大全】Selenium:基于浏览器的测试套件
(点击上方公号,可快速关注) 来源:http://hao.jobbole.com/ 作者:伯乐在线-唐尤华 Selenium是用于在多个平台上自动化操作浏览器的工具套件,支持多种浏览器.多种操作系统. ...
- 史诗级Java资源大全中文版
本文来自GitHub 上 Awesome - java 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容包括:构建工具.数据库.框架.模板.安全.代 ...
- java pippo_【Java资源大全】Pippo:Java小型开源Web微框架
(点击上方公号,可快速关注) Pippo是一个(基于Apache协议)的Java开源Web微框架,依赖关系精简.上手速度很快.这个项目的主要目的是用Java创建一个易于使用和修改的Web微框架.Pip ...
- Java资源大全中文版
Java资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容 ...
最新文章
- KeyError: “None of [Int64Index([...],\n dtype=‘int64‘, length=739)] are in the [columns]“
- 一个简单的UBB程序
- python sql注入脚本_python打造一个分析网站SQL注入的脚本
- 系统工具源码设计页面
- 计算机信息导论论文,电子信息导论论文2000字
- PL/SQL包(Package)
- element 组件中 el-form-item label= ‘vue介绍 (vue设置)‘ 强制换行
- DE12 Continuation: General Theory for Inhomogeneous ODEs
- 树莓派搭建VSFTP记录---自用简记
- JEECG框架创建项目使用步骤
- openwrt php wifi 钓鱼,Openwrt自动扫描WiFi并连接中继
- matlab如何生存对称矩阵,如何使用Matlab产生对称矩阵
- Wordpress 优化小结 杜绝博客因为CPU 占用过高被封
- 苹果手机安兔兔压力测试软件,10款跑分软件压力测试(一)
- flask架设微信小程序服务器,苹果手机能正常访问,安卓不行(ssl的中间证书问题)
- c语言中char有无符号,char代表有符号还是无符号?
- EMQ压力测试及系统优化(单机11万并发连接)
- python学习之编写学员管理系统
- 仿支付宝头像外加一个边框的工具类
- 第三方支付机构和非银行支付机构的区别?第三方支付客户备付金介绍
热门文章
- 《剑指offer》c++版本 4.二维数组中的查找
- oracle数据库 spring,oracle spring 连接数据库 报错
- java中正则表达式函数_java正则表达式PHP中的正则表达式函数介绍
- 线程池框架_Java并发——Executor框架详解(Executor框架结构与框架成员)
- php事件和行为,Yii框架组件和事件行为管理详解
- 恒驰机器人_恒大汽车基地:2545台机器人为恒驰“效力”
- android+proguard目录,Android Proguard 详解
- matlab 连续显示,请教下MATLAB一个问题啊 我想检测一行数据里面出现连续出现0的次数,...
- android自动更新列表,Android数据库表结构自动升级
- html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)