`
cakin24
  • 浏览: 1412219 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

回收资源利器-finally

    博客分类:
  • java
阅读更多

一 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等导致方法终止的语句,否则可能出现一些很奇怪的现象。
0
0
分享到:
评论

相关推荐

    Java学习利器-JAVA解惑

    然而,学习Java的过程中,初学者或经验丰富的开发者都可能会遇到一些棘手的问题,这就是"Java学习利器-JAVA解惑"想要解决的问题。 这份名为"JAVA解惑"的PDF文档,可能是由一位经验丰富的Java开发者或者教育者编写的...

    Java 最常见的 200+ 面试题:面试必备(附详解答案).zip

    - 异常处理:学习try-catch-finally语句块的用法和自定义异常。 - 内存管理:理解栈和堆内存的概念,以及垃圾回收机制。 2. **Java集合框架**: - List、Set和Queue接口:理解它们的区别和各自实现类的特性。 -...

    Java完美编程(第三版) pdf

    本资源包含九个章节的PDF文档,分别是Chapter01至Chapter18的部分内容,尽管不完整,但这些章节覆盖了从基础到进阶的重要知识点。 1. **Chapter01** - Java简介:这一章通常会介绍Java的历史、特点和应用领域,以及...

    Dot-Net-Programming:点网编程实验室

    C#作为.NET框架的核心语言,它的特性包括面向对象、类型安全、支持垃圾回收机制以及丰富的库支持。在C#中,你可以学习到如何定义类、接口和枚举,理解封装、继承和多态等面向对象概念。此外,C#还引入了泛型,使得...

    JavaSourceCodeAnalysis-java source code analysis

    JVM负责自动回收不再使用的对象所占用的内存,但程序员仍需理解何时创建对象、何时释放引用,以及如何避免内存泄漏。通过分析源码,我们可以评估代码的内存效率,查找可能的性能瓶颈。 此外,性能优化是源代码分析...

    ProblemSolvingWithJava:用Java解决问题

    Java的核心特性包括其强大的类库、垃圾回收机制、以及严格的类型检查,这些都使得Java在处理复杂问题时表现出色。例如,Java集合框架(如ArrayList、LinkedList、HashMap等)提供了数据组织和操作的多种方式,适合...

    windows驱动开发技术详解-part2

     5.6.5 结构化异常处理(try-finally块)  5.6.6 使用宏需要注意的地方  5.6.7 断言  5.7 小结 第6章 Windows内核函数  本章介绍了Windows内核模式下的一些常用内核函数,这些函数在驱动程序的开发中将会...

    Windows驱动开发技术详解的光盘-part1

     5.6.5 结构化异常处理(try-finally块)  5.6.6 使用宏需要注意的地方  5.6.7 断言  5.7 小结 第6章 Windows内核函数  本章介绍了Windows内核模式下的一些常用内核函数,这些函数在驱动程序的开发中将会...

Global site tag (gtag.js) - Google Analytics