`
codecook
  • 浏览: 42431 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

finally结构的注意点(一)

阅读更多
我们知道,try-catch-finally结构和try-finally结构是用来捕获异常的典型结构。
而finally结构的作用,通常是在catch结构中抛出异常时做一些清理工作(如释放资源)。
然而有3个典型的问题,可能会影响我们对finally作用的判断。

第一个问题:如果在catch结构中抛出异常,finally结构是否会被执行?
代码如下:
	/**
	 * 测试:如果在catch结构中抛出异常,finally结构是否会被执行。 结果:会被执行。
	 * 
	 * @throws Exception
	 */
	public static void testThrowExceptionInCatch() throws Exception {
		try {
			throw new Exception();
		} catch (Exception ex) {
			throw new Exception();
		} finally {
			System.out.println("finally");// execute this line;
		}
	}

通过执行testThrowExceptionInCatch()函数,我们知道,finally是会执行的。(catch结构也产生了副作用,抛出的异常会覆盖try中抛出的异常)

第二个问题:如果在finally结构中抛出异常,那这个异常会不会覆盖try-catch结构中抛出的异常?
代码如下:
	/**
	 * 测试:如果在finally结构中抛出异常,那这个异常会不会覆盖try-catch结构中抛出的异常。 结果:会覆盖。
	 * 
	 * @throws Exception
	 */
	public static void testThrowExceptionInFinally() throws Exception {
		try {
			throw new Exception();
		} catch (Exception ex) {
			throw new Exception();
		} finally {
			System.out.println("start finally");
			throw new Exception();
		}
	}

通过执行testThrowExceptionInFinally()函数,发现finally结构中抛出异常覆盖了try-catch结构中抛出的异常。

第三个问题:如果在finally结构中有return语句,那这个返回值会不会覆盖try-catch结构中的返回值?
代码如下:
	/**
	 * 测试:如果在finally结构中有return语句,那这个返回值会不会覆盖try-catch结构中的返回值。 结果:会覆盖。
	 * 
	 * @return
	 * @throws Exception
	 */
	public static int testReturnValueInFinally() throws Exception {
		try {
			return 1;
		} catch (Exception ex) {
			throw new Exception();
		} finally {
			System.out.println("finally");
			return 2;// 覆盖返回值
		}
	}

通过执行testReturnValueInFinally()函数,返回值为2,可见finally结构中的return语句覆盖了try-catch结构中的返回值。

可见,finally除了做一些清理工作外,如果运用不当,也是会产生副作用的。
分享到:
评论

相关推荐

    try-catch-finally捕获异常

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

    java 中finally语句块与return的执行关系

    在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细探讨 finally 语句块与 return 的执行关系。 首先,需要了解的是,在 try-finally 或者 catch-finally 中,如果 try 或者 ...

    try-finally-return-in-finally.rar_return

    在编程语言中,`try-finally` 结构是用来确保一段代码在任何情况下(无论是正常执行还是抛出异常)都会被执行的语句块。这个结构在处理资源管理,比如文件流关闭或者网络连接断开等场景时特别有用。当我们谈论`...

    java.try-catch-finally.md

    在介绍的知识点中,我们看到了一段具体的Java代码,用于演示如何使用`try-catch-finally`来处理除以零的异常情况。下面将详细介绍该结构的三个部分:`try`块、`catch`块和`finally`块。 首先,`try`块用于包裹可能...

    try except finally的用法.doc

    try-except-finally结构可以增加程序的健壮性,被视为防御性编程的一种实践。以文件操作为例,即使在读写文件时发生异常,finally块中的代码也能保证文件被正确关闭。在面对如网络或硬件相关的不确定因素时,合理...

    java.try-catch-finally(处理方案示例).md

    使用`try-catch-finally`结构时,需要注意以下几点: 1. `catch`块的异常类型声明应该由具体到一般排序,即先捕获子类异常,再捕获父类异常。 2. 如果在`catch`或`finally`块中发生异常,原异常信息将丢失,除非进行...

    try-except-finally(处理方案示例).md

    try-except-finally结构是Python语言提供的异常处理机制之一,其工作原理是尝试执行一段可能引发异常的代码,当异常发生时则执行except部分的代码进行异常处理,而无论是否发生异常,finally部分的代码都将被执行,...

    java.try-catch-finally(解决方案).md

    try-catch-finally结构是Java中处理异常的基础,其基本用法包括:try块用于包裹可能出现异常的代码,catch块用于捕获并处理特定类型的异常,而finally块则用于执行无论是否发生异常都需要执行的代码,例如资源清理和...

    Java 实例 - Finally的用法源代码-详细教程.zip

    `finally`通常与`try-catch`块一起使用,构成一个完整的异常处理结构。下面将详细探讨`finally`的用法、作用以及相关的编程实践。 1. `try-catch-finally`结构: 在Java中,异常处理主要通过`try-catch`结构来实现...

    dotnet C# 在 finally 抛异常会发生什么.rar

    当`finally`块抛出异常时,以下几点值得注意: 1. **异常覆盖**:如果`finally`块中抛出了新的异常,那么原本在`try`块中抛出的异常会被新异常所覆盖。这意味着原始异常的信息将会丢失,除非在`finally`块内部捕获...

    深入浅析java中finally的用法

    使用finally块需要注意以下几点: 1. finally块只能用在try/catch语句中。 2. finally块中的代码一定会被执行,除非程序中止或退出。 3. finally块可以用于释放资源,例如关闭数据库连接、文件流等。 4. finally块...

    Java异常处理之try...catch...finally详解

    在catch块后还可以跟一个finally块,finally块用于回收在try块里打开的资源。 在使用try…catch语句块时需要知道或注意以下几点: 1. 处理过程:代码在执行的时候,进入try块,若是在try块中出现了异常,系统会...

    Java软件开发实战 Java基础与案例开发详解 10-5 finally关键字 共7页.pdf

    关于`return`语句的使用,有一个重要的原则:既不在`try`内部使用`return`语句,也不在`finally`内部使用`return`语句,而应该在`finally`语句之后使用`return`来表示函数的结束和返回。 通过以上的详细介绍,我们...

    java.try-except-finally(解决方案).md

    Java的异常处理机制是其语言的一个重要特性,提供了结构化错误处理的能力。在Java中,异常处理主要通过try、catch和finally三个关键字来完成。try块用于包含可能抛出异常的代码;catch块用于捕获并处理异常;finally...

    try catch finally的执行顺序深入分析

    总的来说,`try-catch-finally`结构提供了一种强大的错误处理方式,确保了程序在遇到异常时能够继续执行关键的清理任务,并且控制返回值。理解这个执行顺序对于编写健壮的代码至关重要,特别是在处理资源管理和异常...

    java面试题 谈谈final, finally, finalize的区别

    `finally` 用于定义一组必须在任何情况下(无论是否发生异常)都会执行的代码块。它常与 `try-catch` 结构一起使用,确保资源的释放和必要的清理工作。 ```java try { // 可能抛出异常的代码 } catch ...

    C++异常处理 try,catch,throw,finally的用法

    3. finally块的使用:在SEH中,finally块用于释放资源,但是需要注意在ExitThread/ExitProcess/abort等函数时,finally块不会被执行。 高级使用: 1. 使用构造函数防止资源Leak(More effective C++ #10) 2. 禁止...

    数据结构(C#语言版)

    异常处理机制用于捕获和处理程序运行过程中可能出现的错误,通过try-catch-finally结构实现。 - **1.3.8 C#的标准输入/输出流** C#提供了丰富的标准输入输出流,如Console类,用于控制台应用程序的输入输出。 - *...

Global site tag (gtag.js) - Google Analytics