`
周一Monday
  • 浏览: 342495 次
  • 来自: 北京
社区版块
存档分类
最新评论

异常处理之finally块的注意事项

阅读更多
1.在finally块中,关闭资源

public class Test{
	public static void main(String[]args){
	
		FileInputStream fis=null;
		FileOutputStream fos=null;
		......
		try{
			
			//do something...
	
	
		}finally{
			//有危险的关闭方式1
			fis.close();
			fos.close();
			
			//有危险的关闭方式2
			if(fis!=null){
				fis.close;
			}
			if(fos!=null){
				fos.close();
			}
			
			//推荐的方式
			if(fis!=null){
				try{
					fis.close();
				}catch(Exception){
					e.printStackTrace();
				}
			}
			if(fos!=null){
				try{
					fos.close();
				}catch(Exception){
					e.printStackTrace();
				}
			}
		}
	}
}

2.finally块的陷阱
 
 public class Test{
 	public static void main(String[]args){
 		FileOutputStream fos=null;
 		try{
 			 // do something...
 			System.out.println("打开资源");
 			System.exit(0);
 		}finally{
 			if(fos!=null){
				try{
					fos.close();
				}catch(Exception){
					e.printStackTrace();
				}
			}
			System.out.println("关闭资源");
 		}
 	}
 }
 
 解释:这个程序"关闭资源"不会输出,因为try块中的System.exit(0);将当前线程停止了,而finally块不能执行已经停止的线程.
 若非要输出“关闭资源”,且执行System.exit(0);则修改如下:
 
public class Test {

	public static void main(String[] args) throws Exception {
		final FileOutputStream fos;
		fos = new FileOutputStream("a.bin");
		System.out.println("打开物理资源");
	
		//为系统注册关闭钩子
		Runtime.getRuntime().addShutdownHook(new Thread() {
			public void run() {
				if (fos != null) {
					try {
						fos.close();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				System.out.println("程序关闭了资源");
			}
		});
		System.out.println("退出程序");
		System.exit(0);
	}
}


3.finally块和方法返回值

public class Test {

	public static void main(String[] args) {
		int a = test();
		System.out.println(a);
	}
	private static int test() {
		int count = 5;
		try {
			System.out.println("try");
			return count + 2; // 不执行
		} finally {
			System.out.println("finally");
			return -1; // 执行
		}
	}
}

解释:当在try块中有return 语句的时候,且有finlly的时候,不会立马执行try块中的return ,而是执行finally中的程序。
若finally块中也有return 语句,则执行finally中的reutrn 语句,然后程序结束,不会执行try块中的return

public class Test {

	public static void main(String[] args) {
		int a = test();
		System.out.println(a);
	}

	private static int test() {
		int count = 5;
		try {
			throw new RuntimeException("测试异常");  //不执行
		} finally {
			System.out.println("finally"); 
			return count;
		}
	}
}

解释:当在try块中抛出异常时候,若finally块中有 return语句,则程序不会真正抛出异常,而是直接执行完finally块后,返回return语句。

 

分享到:
评论

相关推荐

    JSTL详细标签库介绍

    能够让系统在出现异常的情况下恢复过来的程序使用异常处理情况:异常诊断与异常处理不在同一个位置下时使用异常处理程序(若用户一直通过键盘与程序通话,那么就不能使用处理键盘输入处理)使用异常的注意事项:<BR>...

    CLR.via.C#.(中文第3版)(自制详细书签)

    27.8 APM的注意事项 27.8.1 在没有线程池的前提下使用APM 27.8.2 总是调用EndXxx方法,而且只调用一次 27.8.3 调用EndXxx方法时总是使用相同的对象 27.8.4 为BeginXxx和EndXxx方法使用ref,out和params实参 ...

    涵盖了90%以上的面试题

    Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要自定义类加载器 如何自定义类加载器 什么是GC 内存泄漏和内存溢出 Java的内存模型(JVM的内存划分) ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态扩展能力的应用程序 本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态扩展能力的应用程序 本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态扩展能力的应用程序 本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以...

    21天学通Java-由浅入深

    60分钟) 217 11.1 异常处理基本介绍 217 11.1.1 try和catch捕获异常 217 11.1.2 try-catch语句使用注意点 218 11.1.3 finally语句的使用 220 11.1.4 再谈异常处理注意点 222 11.2 异常的分类 223 11.2.1 捕获异常 ...

    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内核模式下的一些常用内核函数,这些函数在驱动程序的开发中将会...

    《javaScrip开发技术大全》源代码

    • sample30.htm 抛出不同的异常(多catch语句块) • sample31.htm finally语句 • sample32.htm 空语句 • sample33.htm return语句 第8章(\代码\第08章) • sample01....

Global site tag (gtag.js) - Google Analytics