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

异常处理之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语句。

 

分享到:
评论

相关推荐

    try-catch-finally捕获异常

    下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try块 try块是try-catch-finally语句的核心部分,用于包装可能出现异常的代码。try块中的代码在执行时,如果出现异常,会被catch块捕获和处理。...

    使用c# 异常的性能注意事项

    在深入探讨C#中异常处理的性能注意事项之前,我们首先需要理解异常处理的基本概念及其在C#中的实现方式。异常处理是一种程序设计技术,用于在程序执行过程中出现非预期情况时,提供一种有序的方式来恢复程序的正常...

    Java 中的异常和处理详解.docx

    "Java 中的异常和处理详解" ...通过这篇文章,我们了解了 Java 中的异常和处理机制,了解了异常的分类和类结构图,了解了异常处理机制的作用和步骤,了解了异常处理的好处和注意事项,了解了异常处理的 best practice。

    设计异常解决方案的几点注意事项.docx

    在`finally`块中显式抛出异常应尽量避免,因为这可能会混淆异常处理流程。 在选择异常类型时,优先使用系统提供的异常,但如果有特定的错误处理需求,则可以创建自定义异常。避免为了创建新异常而创建,而是应选择...

    Java开发注意事项

    Java提供了强大的异常处理机制,包括try-catch-finally语句块。开发者应当合理使用这些机制,避免程序因未处理的异常而崩溃。同时,应当区分检查性异常(checked exceptions)和运行时异常(runtime exceptions),...

    代码走查注意事项

    1. 异常处理:在Action方法中,不应直接抛出异常。应当使用try-catch块捕获异常,并向用户提供友好的错误提示,避免出现无法理解的乱码或白页。同时,记录异常堆栈信息以帮助定位错误。 2. 事务管理: - 事务应...

    Java异常基础知识总结文档

    在Java程序中,可以通过try-catch-finally块来自主处理异常,try块内放置可能抛出异常的代码,catch块用来捕获特定类型的异常并进行处理,而finally块则通常用于执行清理操作,如释放资源。 编译时异常必须在try块...

    超级详细的讲解Java异常ppt,带你深入了解Java异常

    在Java中,异常处理通常使用`try-catch-finally`语句块来实现。`try`块包含可能会抛出异常的代码,`catch`块则用于捕获并处理特定类型的异常,`finally`块则是可选的,无论是否发生异常,这部分代码都会被执行,常...

    JAVA注意事项

    3. **异常处理**:Java使用try-catch-finally结构处理异常,确保资源得到正确释放。避免忽视finally块,以防止资源泄露。 4. **内存管理**:虽然Java有垃圾回收机制,但过度创建对象仍可能导致内存溢出。合理使用...

    java异常学习总结

    2. **异常处理的原则与注意事项** - 在设计异常处理时,应始终考虑当异常发生时,如何确保系统的正常运行状态能够得到妥善处理。 - 异常处理不仅要考虑当前层次上的处理,还要考虑异常向上抛出的情况。 #### 三、...

    异常底层详解

    #### 四、异常处理注意事项 - **避免滥用异常**:应将异常用于真正的错误处理而不是正常的控制流。 - **选择合适的异常类型**:确保使用的异常类型准确反映了问题的本质。 - **记录异常信息**:在捕获异常后应该...

    Java异常处理的五个关键字

    异常处理的注意事项: 1. 错误不是异常,而是脱离程序员控制的问题。 2. 所有的异常类是从 java.lang.Exception 类继承的子类。 3. 异常类有两个主要的子类:IOException 类和 RuntimeException 类。 4. Java 有很...

    java异常总结

    - **注意事项**: 子类异常必须出现在父类异常之前。 3. **try-finally**: - **定义**: 不论是否发生异常,`finally`块中的代码都会被执行。 - **应用场景**: 用于释放资源等操作。 4. **try-catch-finally**: ...

    Python技术使用注意事项.docx

    Python是一种广泛应用于各种领域的编程语言,以其简洁的语法和丰富的...这些注意事项能帮助开发者充分利用Python的优势,开发出高效、安全、易于维护的程序。遵循这些最佳实践,将使你在Python开发旅程中更加得心应手。

    .NET中的异常和异常处理用法分析

    这篇文章将深入探讨.NET中的异常及其处理机制,提供一些关键的注意事项和良好的异常处理实践。 异常是程序运行期间发生的非正常事件,可能导致程序中断。在.NET中,所有异常都直接或间接地继承自`System.Exception`...

    JSTL详细标签库介绍

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

    Java基本语法第三季

    - **finally块注意事项**: - 不论是否发生异常,`finally`块中的代码都将被执行。 - 当`try`和`catch`块中包含`return`语句时,`finally`块依然会被执行。 - `finally`块会在`return`语句执行之后,但在实际返回...

    jni方法里面抛出异常

    - 本地方法抛出异常后,Java方法栈上的所有finally块都不会执行,这是与Java异常处理的一个关键区别。 综上所述,理解和掌握JNI中的异常处理是Android开发中的重要技能,它能帮助开发者在混合编程时更好地处理错误...

    Python异常处理机制结构实例解析

    4. **finally块中的return问题**:在`finally`块中使用`return`语句会导致`try`或`except`块中的`return`语句失效。例如: ```python def test(): try: return True finally: return False print(test()) #...

Global site tag (gtag.js) - Google Analytics