大家都知道在java处理异常的时候,try-catch-finally块是一个常见的结构,它用于捕获和处理异常,本文将重点介绍finally的重点用法。
一:什么是finally块?
finally是java的一个关键字,在异常处理中,无论异常是否被处理,finally都会在以下情况下执行:
- 在'try'块中的代码执行完成后。
- 在发生异常并被 `catch` 块捕获后。
但是此块也会存在不执行的情况,如:
- 没有进入try块。
- 进去try代码块,但是代码运行中出现了死循环和死锁的状态。
- 进入try代码块,但是执行了System.exit()操作。
示例代码如下:
public static int finallyNotWork() {
int temp = 1000;
try {
throw new Exception();
}catch (Exception e) {
return ++temp;
}finally {
temp = 9999;
}
}
注意:finally是在return表达时运行后执行的,此时将要return的结果已经被暂存起来,待finally代码结束后在将之前的暂存的结果返回。也就是说最终返回的结果是1001,而不是9999。所以finally的职责不在于对变量进行赋值操作,而是清理资源,释放连接,关闭管道流等的操作。而更加危险的方式是以下情况:
public class TryFinally {
public static int x = 1;
public static int y = 10;
public static int z = 100;
public static int finallyReturn() {
try {
return ++x;
}catch (Exception e) {
return ++y;
}finally {
return ++z;
}
}
public static void main(String[] args) {
int value = finallyReturn();
System.out.println("value is " + value);
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("z = " + z);
}
}
思考:大家可以先思考一下这个函数的执行结果?
执行结果如下:value=101; x=2; y=10; z=101;
以上执行结果说明:
- 最后return的动作是由finally代码块中的return ++z完成的,所以返回的结果是101。
- 语句return ++x中的++x被成功执行,所以运行结果是x=2。
- 如果有异常抛出运行结果将是y=11,而x=1.
二:总结
finally代码块中使用return语句 ,是返回值判断变得更加的复杂,所以避免返回值不可控,我们不可以在finally代码块中使用return语句。总之,finally主要目的是为了清理资源,释放连接,关闭管道流以及一些垃圾回收的操作。