目录
- 实例
- 结论
实例
1.try和catch中有return时,finally里面的语句会被执行吗 我们可以来分别看看
(1)执行try中的return时
public class Solution {
public static int show() {
try {
return 1;
}finally{
System.out.println("finally模块被执行");
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
(2)执行catch中的return时
public class Solution {
public static int show() {
try {
int a = 8/0;
return 1;
}catch (Exception e) {
return 2;
}finally{
System.out.println("finally模块被执行");
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
我们可以得出结论: 如果程序是从try代码块或者catch代码块中返回时,finally中的代码总会执行。而且finally语句在return语句执行之后return返回之前执行的。
2.如果finally也有return的时候
public class Solution {
public static int show() {
try {
int a = 8/0;
return 1;
}catch (Exception e) {
return 2;
}finally{
System.out.println("finally模块被执行");
return 0;
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
结论: 我们可以看到当finally有返回值时,会直接返回。不会再去返回try或者catch中的返回值。
3.finally中对于返回变量做的改变会影响最终的返回结果吗 我们先来看一看如果try或者catch中的返回值是普通变量时。
public class Solution {
public static int show() {
int result = 0;
try {
return result;
}finally{
System.out.println("finally模块被执行");
result = 1;
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
并不会改变返回的内容。 当返回的变量的类型是引用类型时,结果也是一样的 代码如下:
public class Solution {
public static Object show() {
Object obj = new Object();
try {
return obj;
}finally{
System.out.println("finally模块被执行");
obj = null;
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
我们可以得出以下结论: 如果try和catch的return是一个变量时且函数的是从其中一个返回时,后面finally中语句即使有对返回的变量进行赋值的操作时,也不会影响返回的值。
结论
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。