Java-try_catch_finally中带有return语句的执行顺序

时间:2021-02-02 18:23:26

我们知道,在try_catch_finally块对异常进行捕捉时,一定会执行到finally块中的语句。看下面例子:


Test1:(try语句中有return,finally中没有)

    public static void main(String[] args) {
System.out.println(test());
}

public static int test() {
int num = 10;
try {
System.out.println("try");
return num += 50;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (num > 50) {
System.out.println("num=" + num);
}
System.out.println("finally");
}
return num + 20;
}
}

执行结果:

try
num=60
finally
60

Test2:(try和finally语句中均有return语句)

public class TestFinallyDemo01 {
public static void main(String[] args) {
System.out.println(test());
}

@SuppressWarnings("finally")
public static int test() {
int num=10;
try{
System.out.println("try");
return num+=50;
}catch(Exception e){
e.printStackTrace();
}finally{
if(num>50){
System.out.println("num="+num);
}
System.out.println("finally");
return num+20;
}
}
}

执行之后的结果:

try
num=60
finally
80

可以看出,在try语句块中,return num+=50分成了两条语句执行,num=num+50和return num;而这里只执行了num=num+50这句,然后进入finally块,最后在finally块中进行return.在finally块中有return语句的时候,会覆盖掉try语句中的return语句。


Test3(finally语句块中修改变量的值)

public class TestFinallyDemo03 {
public static void main(String[] args) {
System.out.println(test());
}

public static int test() {
int num = 10;
try {
System.out.println("try");
return num += 50;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (num > 50) {
System.out.println("num=" + num);
}
System.out.println("finally");
num+=30;
//return num; 加这句可以返回改变后的值
}
return num + 20;
}
}

执行结果:

try
num=60
finally
60

这里可以看出,在final语句块中,num+=30执行后再try语句块中的return似乎并没有“感受”到。


Test4(finally语句块中修改引用变量的值)

public class TestFinallyDemo04 {
public static void main(String[] args) {
System.out.println(test().n);
}

public static Num test() {
Num num=new Num();
try {
System.out.println("try");
return num;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (num.n > 50) {
System.out.println("num.n=" + num.n);
}
System.out.println("finally");
num.n=200;
}
return num;
}
}
class Num{
public int n=10;
}

执行后结果:

try
finally
200

总结:
1)若try语句块中有return,finally语句块中没有,则执行完try中的语句,然后执行finally语句中的语句,最后执行try中的return
2)若try语句块和finally语句块中均有return语句,则执行完try语句后,进入finally块,然后执行finally块中的return语句。
3)若try语句块中有return,在finally语句中修改变量值时,如修改的为值类型的数据,则在try语句块中相当于是不可见的,而如果是引用类型的值,则在try语句块中是可见的。

相关文章