Java異常處理中同時(shí)有finally和return語句的執(zhí)行問題
在Java中當(dāng)try、finally語句中包含return語句時(shí),執(zhí)行情況到底是怎樣的,finally中的代碼是否執(zhí)行,大家眾說紛紜,有的說會(huì)執(zhí)行,有的說不會(huì)執(zhí)行,到底哪種說法正確,現(xiàn)在通過下面的例子加以說明:
第一種情況:try中包含return語句,finally中不包含
public class TestTry {
static String s="";
public static void main(String args[]){
s = test1();
System.out.println("8 "+s);
}
public static String test1(){
try{
System.out.println("try.....");
return s = "a";
}
finally{
s="b";
System.out.println("17 "+s);
}
}
}
這里我們定義了一個(gè)字符串 s,在try里面將"a"賦值給s,并直接返回,在finally里面把"b"賦值給s,最終s的值是a還是b呢?下面是執(zhí)行的結(jié)果
try..... 17 b 8 a
我們發(fā)現(xiàn)最后的結(jié)果是a,但是b優(yōu)先于a打印出來了,這是為什么呢?通過debug單步調(diào)試我們發(fā)現(xiàn),在執(zhí)行try中的return之前會(huì)先執(zhí)行finally中的代碼,之后再執(zhí)行return語句。如果finally中也包含return語句,會(huì)出現(xiàn)什么情況呢,我們看第二種情況。
第二種情況:try,finally中都包含return語句
我們將上面的代碼稍作改動(dòng)
public class TestTry {
static String s="";
public static void main(String args[]){
s = test1();
System.out.println("8 "+s);
}
public static String test1(){
try{
System.out.println("try.....");
return s = "a";
}
finally{
return s="b";
}
}
}
將finally中的s="b";直接改成return s="b";,會(huì)出現(xiàn)什么樣的結(jié)果呢?字符串s是a還是b呢?
try..... 8 b
我們發(fā)現(xiàn)最后的打印結(jié)果是b。
我們知道return語句用在某一個(gè)方法中,一是用于返回函數(shù)的執(zhí)行結(jié)果,二是用于返回值為void類型的函數(shù)中,僅僅是一個(gè)return語句(return ;),此時(shí)用于結(jié)束方法的執(zhí)行,也即此return后的語句將不會(huì)被執(zhí)行,當(dāng)然,這種情況下return語句后不能再有其它的語句了。
public static int print() {
int c = 1;
try {
c++;
System.out.println("try執(zhí)行中...");
return c+100; //--------1
} catch (Exception e) {
e.printStackTrace();
//return c; //--------4
} finally {
c++;
System.out.println("finally執(zhí)行中...");
return c; //--------2
}
//return c; //---------3
}
程序執(zhí)行的結(jié)果為:
run:
try執(zhí)行中...
finally執(zhí)行中...
3
成功構(gòu)建 (總時(shí)間: 0 秒)
注意,2與3位置處的return語句只能有一個(gè),并且2、3、4中必須有一個(gè)return語句,如果2出執(zhí)行后方法就結(jié)束了,3處的語句得不到執(zhí)行。
try語句塊執(zhí)行到1處時(shí),會(huì)將會(huì)將函數(shù)的返回值存放到另外一個(gè)臨時(shí)變量(不同與c的變量,它的值為102)中,由于未發(fā)生異常,緊接著將會(huì)執(zhí)行finally語句塊,2處又遇到一個(gè)語句塊,并將返回值存放到臨時(shí)變量(值為3)中,最終返回的是此處的臨時(shí)變量的值,此處return執(zhí)行完成后,該方法結(jié)束。
public static int print() {
int c = 1;
try {
c++;
System.out.println(c);
System.out.println("try");
return c+100; //--------1
}finally {
c++;
System.out.println(c);
System.out.println("finally");
}
}
上述代碼中finally語句塊中沒有return語句,函數(shù)最終返回的是第一個(gè)臨時(shí)變量的值,也即102,執(zhí)行結(jié)果如下:
run: try finally 102 成功構(gòu)建 (總時(shí)間: 0 秒)
結(jié)論:1.無論try里面有沒有return語句,finally語句一定都會(huì)執(zhí)行(不愧是finally,名字起的好)。
2.如果finally中沒有return語句,try里面有return,那么在執(zhí)行try中的return語句之前會(huì)先去執(zhí)行finally中的代碼,再去執(zhí)行try中的return語句;如果在finally中也包含return語句,將會(huì)直接返回,不再去執(zhí)行try中的return語句。
相關(guān)文章
Double.parseDouble()與Double.valueOf()的區(qū)別及說明
這篇文章主要介紹了Double.parseDouble()與Double.valueOf()的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Spring Boot實(shí)戰(zhàn)教程之自動(dòng)配置詳解
Spring Boot的自動(dòng)配置給開發(fā)者帶來了很大的便利,當(dāng)開發(fā)人員在pom文件中添加starter依賴后,maven或者gradle會(huì)自動(dòng)下載很多jar包到classpath中。下面這篇文章主要給大家介紹了關(guān)于Spring Boot自動(dòng)配置的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07
Spring boot從安裝到交互功能實(shí)現(xiàn)零基礎(chǔ)全程詳解
這篇文章主要介紹了Spring boot從安裝到交互功能得實(shí)現(xiàn)全程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法
今天小編就為大家分享一篇關(guān)于實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
java?啟動(dòng)參數(shù)?springboot?idea詳解
這篇文章主要介紹了java?啟動(dòng)參數(shù)?springboot?idea的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09

