我們知道,在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語句塊中是可見的。