一 finally回收资源介绍
1 有时,程序在try块里打开了一些物理资源(例如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。
2 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存对象所占用的内存。
3 完整Java异常处理语法结构如下:
try
{
需要检测的代码;
}
catch(异常类 变量)
{
异常处理代码;
}
finally
{
资源回收代码,一定会执行的代码;
}
异常处理语法结构中,只有try块是必须的,也就是说,如果没有try块,则不能有后面的catch块和finally块;catch块和finally块都是可选的,但catch块和finally块至少出现其中之一,也可以同时出现;可以有多个catch块,捕获父类异常的catch块必须位于捕获子类异常的后面;但不能只有try块,既没有catch块,也没有finally块;多个catch块必须位于try块之后,finally块必须位于所有的catch块之后。
二 finaly回收资源应用
1 代码示例
import java.io.*; public class FinallyTest { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("a.txt"); } catch (IOException ioe) { System.out.println(ioe.getMessage()); // return语句强制方法返回 return ; // ① // 使用exit来退出虚拟机 // System.exit(1); // ② } finally { // 关闭磁盘文件,回收资源 if (fis != null) { try { fis.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } System.out.println("执行finally块里的资源回收!"); } } }
2 运行结果
a.txt (系统找不到指定的文件。)
执行finally块里的资源回收!
3 结果分析
- 程序的catch块中①有一条return语句,该语句强制方法返回,在通常情况下,一旦在方法里执行到return语句的地方,程序立即结束该方法;现在不会了,虽然retun语句也强制方法结束,但一定会先执行finally块里的代码。从运行结果来看,方法返回之前,还是执行了finally块的代码。
- 如果将①处的return语句注释掉,取消②处代码的注释,即在异常处理的catch块中使用了System.exit(1)语句来退出虚拟机,执行代码,结果如下:a.txt (系统找不到指定的文件。)上面的执行结果表明finally块没被执行。也就是说,如果在异常处理代码中使用了System.exit(1)语句来退出虚拟机,则finally块将失去执行的机会。
- 除非在try块,catch块中调用了退出虚拟机的方法,否则不管在try块或catch块中执行怎样的代码,出现怎样的情况,异常处理的finally块总会被执行。
三 finally的错误用法举例
1 代码示例
public class FinallyFlowTest { public static void main(String[] args) throws Exception { boolean a = test(); System.out.println(a); } public static boolean test() { try { // 因为finally块中包含了return语句 // 所以下面的return语句失去作用 return true; } finally { return false; } } }
2 运行结果
false
3 代码分析
- 上面程序中finally块中定义了一个renturn false语句,这将导致try块中的return true语句失去作用,打印出false的结果。
- 当Java程序执行try块,catch块时,如果遇到了return或throw语句,系统并不会结束该方法,而是去寻找该异常处理流程中收包含finally块,如果没有finally块,程序立即执行return或throw语句,方法终止。如果有finally块,系统立即开始执行finally块,只有当finally块执行完后,系统才会再跳回来执行try块,catch块里的return或throw语句。如果finally块也使用了return或throw等导致方法终止的语句,finally块将终止该方法,系统将不会再跳回去执行try块或catch块里的任何代码。
- 尽量避免在finally里使用return或throw等导致方法终止的语句,否则可能出现一些很奇怪的现象。
相关推荐
免杀破解利器-OEP查找工具-OepFinder汉化版免杀破解利器-OEP查找工具-OepFinder汉化版
【编程利器--ed】是一款强大的文本编辑工具,它在功能上超越了EdiPlus 3.0,成为了许多程序员和Web开发者的心头好。这款编辑器不仅具备了基础的文本编辑功能,还针对多种编程语言提供了丰富的支持,包括但不限于C/...
ip-guard网络监控-管理利器--完美破解406用户[2
视频学习利器--复读机。
电子书制作利器--友益文书 V6.5.1 该软件是一款集资料管理、电子图书制作、多媒体课件制
ip-guard网络监控-管理利器--完美破解406用户[1].part3
ip-guard网络监控-管理利器--完美破解406用户. 本人用了一年
GIS开发利器-MapXtreme 2008
ip-guard网络监控-管理利器--完美破解406用户[1]
电脑飞鸽传书2010 飞鸽传书2010,绿色版软件,体积小巧,无需安装 文字通讯、文件(夹)传输、语音、视频、远程控制等多媒体功能 具有群聊、多人语音、多人视频、网络会议室等专业即时通讯软件功能 ...
将PCB的GERBER文件转换成G代码的利器---coppercam软件下载
Excel交互利器 - 切片器
Windows下访问LINUX的利器-SSH
扫鸡利器 - 自动整理ip.zip
网管利器-破解版聚生网络管理软件,有效监控网络,分时段分机器限制流量
然而,学习Java的过程中,初学者或经验丰富的开发者都可能会遇到一些棘手的问题,这就是"Java学习利器-JAVA解惑"想要解决的问题。 这份名为"JAVA解惑"的PDF文档,可能是由一位经验丰富的Java开发者或者教育者编写的...
【标题】:“自己写的必备利器--消息狂刷器---有源代码”揭示了这是一个由个人开发者编写的软件工具,主要用于大量发送消息。该工具可能是为了测试、自动化或某种特定目的而设计,它提供了源代码,意味着用户可以...
AWR报告分析利器 ---兼容10g,11g,12c,18c,19c-附件资源
思考的利器-21个进发灵感的考具-21个进发灵感的考具
网站利器-海纳采集器, 比火车头好用多了