我们知道,在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语句块中是可见的。