finally的特殊用途

finally允许你定义一个finally_block

若try_block被执行则这个finally_block必定被执行,即使try_block中发生了跳转或者异常(它会在跳转或异常前执行)

 

function test(){
	for (var i = 0; i < 3; i++) {
		try {
			if (i == 1){
				break;
			}
		}
		finally {
			alert(i);
		}
	}
}
test();

 这个特性很重要,它允许我们做某些事情

 

比如触发事件的时候,我们需要挨个触发绑定在事件上的监听器函数.

但是如果其中某个函数需要抛出异常呢?

这样我们的触发过程就会被打断.这是我们不愿意看到的.

我们可以把触发函数放在try_block中, 把继续触发放在finally中, 这样就可以既抛出异常,又不打断我们的触发过程.

代码类似这样

 

var listeners = [function (){
		throw new Error('exception in event listener.');
	}, function (){
		alert('1');
	}];
function disp(){
	for (var i = 0; i < listeners.length; i++) {
		try {
			listeners[i]();
		} finally {
			continue;
		}
	}
}
disp();

 不过使用finally控制了异常的流程, 所以在disp()外面加上try catch也是无法捕获到那个Error的了.

这也算是一个小小的缺点吧

<think>嗯,用户想了解Java中finally关键字的作用以及是否必须使用。首先,我需要回顾一下finally的基本功能。根据引用[1],finally块在try-catch之后执行,无论是否发生异常都会运行。比如释放资源之类的操作适合放在这里。 然后,用户问是否有必要使用finally。根据引用[1]的注意事项,finally不是必须的,可以省略。但如果需要确保某些代码一定执行,比如关闭文件或数据库连接,就必须用finally了。比如在try里打开文件,不管有没有异常,最后都要关闭,这时候就需要finally。 接下来,用户可能想知道不使用finally的情况。比如如果try或catch中有System.exit(),finally就不会执行,但这种情况比较少见。另外,引用[2]提到finally里的return会覆盖之前的返回值,所以要注意不要在finally里写return,否则可能导致意外结果。比如例子中的demo方法,如果finally里有return 1,那么无论try里返回什么,最终都是1。 还有引用[3]中的例子,num()方法在try里return i=10,但finally里虽然修改i为20,但由于return的值在finally执行前已经确定了,所以最终返回的还是10。这说明即使finally修改了变量,也不影响已经确定的返回值,但如果finally中有return,就会覆盖。所以使用时要小心。 总结下来,finally的作用是确保代码执行,但并不是强制必须使用的,只有在需要确保清理资源时才需要。同时,使用时要注意避免在finally中写return语句,防止逻辑错误。用户可能需要知道这些使用场景和注意事项来判断是否有必要在自己的代码中使用finally。</think>### finally关键字的作用及必要性分析 #### 一、finally关键字的作用 1. **确保代码执行** finally代码块位于try-catch结构之后,**无论程序正常执行还是抛出异常,finally中的代码都会执行**。这一特性使其适用于资源释放(如关闭文件、数据库连接)或清理操作[^1]。例如: ```java try { FileInputStream file = new FileInputStream("test.txt"); // 操作文件 } catch (IOException e) { e.printStackTrace(); } finally { file.close(); // 无论是否异常,都会关闭文件 } ``` 2. **覆盖返回值(需谨慎)** 若finally代码块中包含`return`语句,**它会覆盖try或catch中的返回值**。例如引用[2]中的代码: ```java public static int demo() { try { return 1; } finally { return 2; // 最终返回2 } } ``` 3. **处理异常后的逻辑** 即使try中抛出未捕获的异常,finally代码块仍会执行,适合记录日志或发送通知等场景。 --- #### 二、finally是否必须使用? 1. **非强制但特定场景必要** - **非必要场景**:若无需资源清理或确保代码执行,可省略finally(如仅需异常捕获)。 - **必要场景**:资源管理(如文件、网络连接)必须使用finally,避免资源泄漏。 2. **替代方案** Java 7引入的`try-with-resources`语法可替代finally的资源关闭操作: ```java try (FileInputStream file = new FileInputStream("test.txt")) { // 自动关闭文件 } catch (IOException e) { e.printStackTrace(); } ``` 3. **注意事项** - 避免在finally使用`return`,否则可能导致预期外的返回值[^2]。 - finally不执行的特殊情况:若在try/catch中调用`System.exit()`或JVM崩溃。 --- #### 三、示例说明 引用[3]的代码中: ```java public static int num() { try { int i = 10; return i; // 返回10(值已暂存) } finally { int i = 20; // 不影响已暂存的返回值 } } ``` finally中对变量`i`的修改不会影响返回值,因为`return i`的值在finally执行前已确定。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值