java異常處理執(zhí)行順序詳解try catch finally
不含return的執(zhí)行順序
執(zhí)行順序?yàn)閳?zhí)行try中代碼,如果沒(méi)有異常,然后執(zhí)行try catch后續(xù)的代碼。如:
public static void main(String[] args) { try { int j = 10 / 2; System.out.println("執(zhí)行try中代碼!"); } catch (Exception e) { e.printStackTrace(); System.out.println("執(zhí)行catch中代碼!"); } System.out.println("執(zhí)行catch后的代碼!"); }
執(zhí)行結(jié)果為:
如果有異常,則try中異常后的代碼將不執(zhí)行,開(kāi)始執(zhí)行catch中的代碼,執(zhí)行完成后,執(zhí)行try catch后續(xù)的代碼,示例代碼如下:
public static void main(String[] args) { try { int j = 10 / 0; System.out.println("執(zhí)行try中代碼!"); } catch (Exception e) { e.printStackTrace(); System.out.println("執(zhí)行catch中代碼!"); } System.out.println("執(zhí)行catch后的代碼!"); }
執(zhí)行結(jié)果
發(fā)生異常語(yǔ)句后的代碼:System.out.println(“執(zhí)行try中代碼!”)不再執(zhí)行。
finally子句
使用try catch finally子句時(shí),無(wú)論發(fā)生不發(fā)生異常,finally子句中的代碼都是要執(zhí)行,一般用于釋放資源、連接等操作。
public static void main(String[] args) { try { int i = 8/0; System.out.println("執(zhí)行try中代碼!"); } catch (Exception e) { System.out.println("執(zhí)行catch中代碼!"); } finally { System.out.println("執(zhí)行finally中代碼!"); } System.out.println("執(zhí)行try catch后的代碼!"); }
執(zhí)行try catch或try catch finally之后,執(zhí)行后續(xù)的代碼。
含return的執(zhí)行順序
如果不包含finally語(yǔ)句,在try子句和catch子句中均含有return語(yǔ)句,代碼遇到return語(yǔ)句則終止代碼的執(zhí)行,try catch后面的語(yǔ)句不可能得到執(zhí)行。
含有finally語(yǔ)句的try catch子句包含return語(yǔ)句執(zhí)行順序,執(zhí)行finally子句,然后執(zhí)行try或者catch的return語(yǔ)句,此時(shí)若finally語(yǔ)句包含return或終止運(yùn)行,則try catch子句中的return語(yǔ)句將不執(zhí)行。如:
public static void main(String[] args) { Integer i= testReturn(); System.out.println(i); } public static Integer testReturn(){ try { int i = 8/0; System.out.println("執(zhí)行try中代碼!"); return 1; } catch (Exception e) { System.out.println("執(zhí)行catch中代碼!"); return 0; } finally { System.out.println("執(zhí)行finally中代碼!"); return 3; } }
執(zhí)行結(jié)果
如果再finally終止程序運(yùn)行,則丟失返回值
public static void main(String[] args) { Integer i= testReturn(); System.out.println(i); } public static Integer testReturn(){ try { int i = 8/0; System.out.println("執(zhí)行try中代碼!"); return 1; } catch (Exception e) { System.out.println("執(zhí)行catch中代碼!"); return 0; } finally { System.out.println("執(zhí)行finally中代碼!"); System.exit(0); //退出程序,返回值丟失 } }
執(zhí)行結(jié)果如下圖:
沒(méi)有輸出返回值
返回類型是對(duì)象類型時(shí)值的變化
返回類型如果是對(duì)象類型,則返回的是指針。此時(shí)如果finally中包含對(duì)象的炒作,注意返回值的變化。示例代碼如下
創(chuàng)建一個(gè)Person的類
public class Person { private String name; private String adress; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", adress='" + adress + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } }
含有return的測(cè)試代碼如下
public static void main(String[] args) { Person person = testObjReturn(); System.out.println(person.toString()); } public static Person testObjReturn(){ Person person = new Person(); try { int i = 8/0; person.setName("王小二"); person.setAdress("電子街1號(hào)"); return person; } catch (Exception e) { person.setName("朱小三"); person.setAdress("電子街1號(hào)"); return person; } finally { person.setName("李老五");; } }
執(zhí)行結(jié)果
結(jié)論
try catch finally帶有return語(yǔ)句時(shí),既可以將return語(yǔ)句放到try和catch中,也可以放到過(guò)程的結(jié)尾,一般建議放到結(jié)尾,便于統(tǒng)一管理。特別注意finally包含return語(yǔ)句時(shí)try、catch中的return將不再執(zhí)行。尤其當(dāng)返回的變量是實(shí)體對(duì)象時(shí),finally中的語(yǔ)句如果對(duì)返回的變量進(jìn)行修改,則將影響到返回值。
以上就是java異常處理執(zhí)行順序詳解try catch finally的詳細(xì)內(nèi)容,更多關(guān)于java異常try catch finally執(zhí)行順序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 關(guān)于Java中try finally return語(yǔ)句的執(zhí)行順序淺析
- 淺談Java finally語(yǔ)句到底是在return之前還是之后執(zhí)行(必看篇)
- 談?wù)凧ava中try-catch-finally中的return語(yǔ)句
- Java異常處理中同時(shí)有finally和return語(yǔ)句的執(zhí)行問(wèn)題
- 淺談Java中return和finally的問(wèn)題
- 詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序
- java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷
- 詳解Java中finally和return的執(zhí)行順序
相關(guān)文章
SpringBoot使用 druid 連接池來(lái)優(yōu)化分頁(yè)語(yǔ)句
這篇文章主要介紹了SpringBoot使用 druid 連接池來(lái)優(yōu)化分頁(yè)語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11JAVA自定義注解實(shí)現(xiàn)接口/ip限流的示例代碼
本文主要介紹了JAVA自定義注解實(shí)現(xiàn)接口/ip限流的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07簡(jiǎn)單介紹Java網(wǎng)絡(luò)編程中的HTTP請(qǐng)求
這篇文章主要介紹了簡(jiǎn)單介紹Java網(wǎng)絡(luò)編程中的HTTP請(qǐng)求,需要的朋友可以參考下2015-09-09使用@Cacheable緩存解決雙冒號(hào)::的問(wèn)題
這篇文章主要介紹了使用@Cacheable緩存解決雙冒號(hào)::的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12