try...catch...finally
try
中间有返回值,那么finally
还执行吗finally
中的代码块都会执行,不管try
中有没有return
,也不管有没有出现异常。
这个大家都知道,通常这个finally
关键字,都是用来释放资源的,比如关闭流。
try
中间有return
返回,finally
中间也有,会发生什么这个问题有点困扰,平常我们不会这样写代码,正如上面说的,我们通常是用来释放资源的。
但如果在finally
出现了return
代码,应该知道将会出现什么样的结果。
注意看下面这段代码
package com.banmoon.finallytest;
import org.junit.Test;
public class FinallyTest {
@Test
public void test() {
System.out.println(finallyIntGet(1));
System.out.println(finallyIntGet(0));
}
public static int finallyIntGet(int n) {
int num = 0;
try {
if (n == 0) {
throw new Exception();
}
return num;
} catch (Exception e) {
return -1;
} finally {
num = 1;
return num;
}
}
}
在心中想一想它俩的答案,我这边直接放出来了
这就说明,如果finally
当中有返回的话,那将以finally
的返回值为准。
那么
finally
执行的时间点是什么时候?? 是这样子的,当上面的代码块进行return
时,会将这个返回值保存起来,先去执行finally
中的代码。 如果finally
中有return
,那就会替换掉上面保存的返回值,以finally
的返回值为准
try
中间有return
返回一个变量,在finally
中修改这个变量,会发生什么我们将上面代码中的return
注释掉,只保留上面的两个return
,如下
package com.banmoon.finallytest;
import org.junit.Test;
public class FinallyTest {
@Test
public void test() {
System.out.println(finallyIntGet(1));
System.out.println(finallyIntGet(0));
}
public static int finallyIntGet(int n) {
int num = 0;
try {
if (n == 0) {
throw new Exception();
}
return num;
} catch (Exception e) {
return -1;
} finally {
num = 1;
}
}
}
可以看到,改变变量值并不能改变,上面return
时保存下来的值
我是半月,你我一同共勉!!!