连环清洁工之特殊任务--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 FileNotFoundException
FileReader reader = new FileReader("someFile");
int i=0;
while(i != -1){
//reader.read() may throw IOException
i = 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解惑
连环清洁工之特殊任务--java资源如何关闭?的更多相关文章
- try-with-resources 让java资源关闭代码更简洁
一.JDK7的资源关闭方式优化 1 try-with-resource语法 在JDK7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resource语法,才实现了 ...
- Java利用ShutDownHook关闭系统资源
Java关闭钩子 在Java程序中能够通过加入关闭钩子,实如今程序退出时关闭资源的功能. 使用Runtime.addShutdownHook(Thread hook)向JVM加入关闭钩子 public ...
- 基础篇:JAVA资源之IO、字符编码、URL和Spring.Resource
目录 1 JAVA.IO字节流 2 JAVA.IO字符流 3 乱码问题和字符流 4 字符集和字符编码的概念区分 5 URI概念的简单介绍 6 URL概念及与URL的区别 7 Spring.Resour ...
- Java资源大全中文版(Awesome最新版)
Awesome系列的Java资源整理.awesome-java 就是akullpp发起维护的Java资源列表,内容包括:构建工具.数据库.框架.模板.安全.代码分析.日志.第三方库.书籍.Java 站 ...
- Java资源大全中文版(Awesome最新版)(转载)
原文地址:http://www.cnblogs.com/best/p/5876559.html 目录 业务流程管理套件 字节码操作 集群管理 代码分析 编译器生成工具 构建工具 外部配置工具 约束满足 ...
- java.sql.SQLException: 关闭的连接 解决办法
程序如果长时间不进行数据库操作,那么数据源中的 Connection 很可能已经断开.其原因有可能是防火墙,或者连接的数据库设置的超时时间.这里使用的是 C3P0 连接 oracle 数据库,引起的异 ...
- Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...
- Java资源大全中文版
awesome-java-cn 是 Java 资源大全的中文版,包括开发库.开发工具.网站.博客等,将由伯乐在线持续更新. https://github.com/jobbole/awesome-jav ...
- 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: ...
随机推荐
- 在linux中用同一个版本的R 同时安装 Seurat2 和 Seurat3
在linux中用同一个版本的R 同时安装 Seurat 2 和 Seurat 3 Seurat 作为单细胞分析中的重量级R包,有多好用用,用过的人都知道.Seurat 分析流程基本涵盖了单细胞分析中 ...
- OpenStack Telemetry系统架构及实践
1. 概述 早期OpenStack的计量功能由Ceilometer项目负责,后来Ceilometer一分为四,每个项目负责一个方面的工作.不得不说这是OpenStack开发中的一个特色,比如Cinde ...
- fiddler抓HTTPS及APP请求的配置教程
一.fiddler安装 Fiddler官网下载Fiddler进行安装:https://www.telerik.com/fiddler 二.fiddler设置抓取HTTPS的请求 fiddler默认设置 ...
- Linux任务调度(8)
crond任务调度: 是指系统在某个时间执行特定的命令或程序. 分类:1.系统工作,有些重要的工作必须周而复始地执行,如病毒扫描等:2.个别用户工作,个别用户可能希望执行某些程序,如mysql数据库备 ...
- nanopi NEO2 学习笔记 3:python 安装 RPi.GPIO
如果我要用python控制NEO2的各种引脚,i2c 或 spi ,RPi.GPIO模块是个非常好的选择 这个第三方模块是来自树莓派的,好像友善之臂的工程师稍作修改移植到了NEO2上,就放在 /roo ...
- 本地图片上传到GitHub,MarkDown使用Github图片地址
最近在学习用markdown编辑器,我是直接用有道云笔记编辑的,感觉真的好好用,编辑了一半的博客,可以按样式保存在云笔记中,我再也不会忘记写博客了~~ 但是在编辑博客的时候发现了一个问题,那就是本地图 ...
- MSIL实用指南-数学运算
C#支持的数学运算是加.减.乘.除.取模,它们对应的指令是Add.Sub.Mul.Div.Rem. 这五个运算都需要两个参数,它们的通用步骤1.生成加载左边变量2.生成加载右边变量3.生成运算指令 实 ...
- LeetCode 笔记
Valid Sudoku 数独整体能够满足的情况是比较复杂.参考:编程之美 关于数独问题的讨论 这道题的解法可能简单一点,因为对输入进行来限制.只是去判断是否是一个数独数独的形式相比较来说也是较简单的 ...
- vmware上安装的ubuntu连接不上网络
解决方法如下: 1.右键点击ubuntu,选择“设置” 2.网络适配器设置为“仅主机模式”:与主机共享的专用网络.点击“确定”即可.
- lightoj 1111 - Best Picnic Ever(dfs or bfs)
题目链接 http://www.lightoj.com/volume_showproblem.php?problem=1111 题意:给你一个有向图再给你几个人的位置,问所有人可以在哪些点相聚. 简单 ...