一、返回声明变量的情况
public class Demo{
static int num;
public static int Sum() {
//这里把num的定义写在了try和finally的外部,num指向的就是一个了。
try {
num = 10;
System.out.println(num);
num = 30;
return num;
}catch (Exception e) {
e.printStackTrace();
num = 222;
return num;
}finally {
num = 20;
System.out.println("finally的num:"+num);
}
}
public static void main(String[] args) {
System.out.println("main:"+Sum());
System.out.println("Demo.num"+Demo.num);
}
}
输出
10
finally的num:20
main:30
Demo.num20
结论:try或catch的return是一个变量,函数的是从两个之中返回时,后面finally中语句有对返回的变量进行赋值的操作时,不会影响返回的值,但是会影响静态变量num,也就是会影响变量num。假如一些输入流输出流,可以在finally区域块把它们close,因为finally会影响最终的变量,但是不影响try(catch)返回结果,可以说try,catch结果的return虽然在finally后面执行,但是该结果的值要返回的值已经在finally执行前保存到内存,等到执行完finally后,再执行返回保存在内存的值(不受finally影响)。
二、直接返回字面量的情况
// 场景1:try中发生异常,catch和finally都有return
public static int test1() {
try {
System.out.println("执行try块");
int num = 1 / 0; // 发生异常,try的return不会执行
return 1;
} catch (Exception e) {
System.out.println("执行catch块");
return 2; // 暂存返回值2,但不立即返回
} finally {
System.out.println("执行finally块");
return 3; // 最终返回3,覆盖catch的2
}
}
// 场景2:try正常执行return,finally有return
public static int test2() {
try {
System.out.println("执行try块");
return 1; // 暂存返回值1,不立即返回
} catch (Exception e) {
System.out.println("执行catch块");
return 2;
} finally {
System.out.println("执行finally块");
return 3; // 最终返回3,覆盖try的1
}
}
public static void main(String[] args) {
System.out.println("test1返回:" + test1());
System.out.println("test2返回:" + test2());
}
输出
执行try块
执行catch块
执行finally块
test1返回:3
执行try块
执行finally块
test2返回:3












网友评论