詳解Java中finally和return的執(zhí)行順序
Java中finally和return的執(zhí)行順序
try…catch…finally
try-catch-finally是一種針對程序運(yùn)行時(shí)出錯(cuò)的響應(yīng)手段,對于一些可以預(yù)料到的出錯(cuò)類型,在發(fā)生時(shí)對其進(jìn)行報(bào)告和補(bǔ)救。其使用流程如下:首先執(zhí)行try中的語句,如果try中的語句報(bào)錯(cuò)了,那么就轉(zhuǎn)入對應(yīng)的catch語句中執(zhí)行處理異常的措施,catch后的語句中的內(nèi)容是對應(yīng)的錯(cuò)誤類型。無論異常是否發(fā)生,finally中的內(nèi)容一定是會(huì)被執(zhí)行的,一般用來釋放資源,并確保某些操作一定會(huì)執(zhí)行。當(dāng)try和catch中有return時(shí),finally中代碼仍然會(huì)執(zhí)行。
其使用的格式如下:
try {
} catch (IOException e) {
} finally { // 關(guān)閉資源
res.close();
}1. finally語句在return語句執(zhí)行之后return返回之前執(zhí)行的
public class TestTryFinally {
public static void main(String[] args) {
System.out.println(test01());
}
private static int test01() {
int num = 0;
try {
System.out.println("try block");
num = 10;
return num;
} catch (Exception e) {
System.out.println("catch block");
} finally {
System.out.println("finally block");
num = 30;
}
return num;
}
}輸出結(jié)果:
try block
finally block
10
說明return語句已經(jīng)執(zhí)行了再去執(zhí)行finally語句,不過并沒有直接返回,而是等finally語句執(zhí)行完了再返回結(jié)果。
public class TestTryFinally {
public static void main(String[] args) {
System.out.println(test02());
}
private static String test02() {
try {
System.out.println("try block");
return test03();
} catch (Exception e) {
System.out.println("catch block");
} finally {
System.out.println("finally block");
}
return "";
}
private static String test03() {
System.out.println("invoke method: test03()");
return "method test03() return";
}
}輸出結(jié)果:
try block
invoke method: test03()
finally block
method test03() return
說明try中的return語句先執(zhí)行了但并沒有立即返回,等到finally執(zhí)行結(jié)束后再返回。
2. finally塊中的return語句會(huì)覆蓋try塊中的return返回
public class TestTryFinally {
public static void main(String[] args) {
System.out.println(test04());
}
/*
* finally塊中的return語句會(huì)覆蓋try塊中的return返回
*/
private static String test04() {
String s = "init";
try {
System.out.println("try block");
return "try";
} catch (Exception e) {
System.out.println("catch block");
} finally {
System.out.println("finally block");
return "finally";
}
// return s;
}
}輸出結(jié)果:
try block
finally block
finally
這說明finally里的return直接返回了,就不管try中是否還有返回語句,這里還有個(gè)小細(xì)節(jié)需要注意,finally里加上return過后,finally外面的return s就變成不可到達(dá)語句了,也就是永遠(yuǎn)不能被執(zhí)行到,所以需要注釋掉否則編譯器報(bào)錯(cuò)。
3. 如果finally語句中沒有return語句覆蓋返回值,那么原來的返回值可能因?yàn)閒inally里的修改而改變也可能不變。
import java.util.*;
public class TestTryFinally {
public static void main(String[] args) {
System.out.println(test01());
System.out.println("######################");
System.out.println(getMap().get("key").toString());
}
private static int test01() {
int num = 0;
try {
System.out.println("try block");
num = 10;
return num;
} catch (Exception e) {
System.out.println("catch block");
} finally {
System.out.println("finally block");
num = 30;
}
return num;
}
public static Map<String, String> getMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("KEY", "INIT");
try {
map.put("KEY", "TRY");
return map;
} catch (Exception e) {
map.put("KEY", "CATCH");
} finally {
map.put("KEY", "FINALLY");
map = null;
}
return map;
}
}我們先來看一下AI(ChatGPT3.5,Bard和文心一言3.5)給出的答案是什么。我們可以看到ChatGPT和文心一言給出的結(jié)果是:程序會(huì)拋出NullPointerException異常,而Bard給出的結(jié)果為:TRY。



而實(shí)際運(yùn)行代碼,我們得到的結(jié)果為:FINALLY。
輸出結(jié)果:
try block
finally block
10
######################
try block
finally block
finally
為什么test01()中finally里的num = 30;并沒有起到作用,而getMap()中finally的map.put("key", "finally");起了作用,而map = null;卻沒起作用呢?這就是Java到底是傳值還是傳址的問題了,簡單來說就是:Java中只有傳值沒有傳址,這也是為什么map = null這句不起作用。
4. try塊里的return語句在異常的情況下不會(huì)被執(zhí)行
public static void main(String[] args) {
System.out.println(test06());
}
private static int test05() {
int num = 10;
try {
System.out.println("try block");
num = 5 / 0;
return num;
} catch (Exception e) {
System.out.println("catch block");
num += 20;
} finally {
System.out.println("finally block");
num += 30;
}
return num;
}輸出結(jié)果:
try block
catch block
finally block
60
try語句塊中發(fā)生了除0異常,所以try中的return不會(huì)被執(zhí)行到,而是接著執(zhí)行捕獲異常的catch語句和最終的finally語句,此時(shí)兩者對num的修改都影響了最終的返回值。
5. 當(dāng)發(fā)生異常后,catch中的return執(zhí)行情況與未發(fā)生異常時(shí)try中return的執(zhí)行情況完全一樣
public static void main(String[] args) {
System.out.println(test06());
}
private static int test06() {
int num = 10;
try {
System.out.println("try block");
num = 5 / 0;
return num;
} catch (Exception e) {
System.out.println("catch block");
num += 20;
return num;
} finally {
System.out.println("finally block");
num += 30;
}
// return num;
}輸出結(jié)果:
try block
catch block
finally block
30
說明了發(fā)生異常后,catch中的return語句先執(zhí)行,確定了返回值后再去執(zhí)行finally塊,執(zhí)行完了catch再返回,finally里對num的改變對返回值無影響,原因同前面一樣,也就是說情況與try中的return語句執(zhí)行完全一樣。
到此這篇關(guān)于Java中finally和return的執(zhí)行順序的文章就介紹到這了,更多相關(guān)Java finally和return 執(zhí)行順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于Java中try finally return語句的執(zhí)行順序淺析
- 淺談Java finally語句到底是在return之前還是之后執(zhí)行(必看篇)
- 談?wù)凧ava中try-catch-finally中的return語句
- Java異常處理中同時(shí)有finally和return語句的執(zhí)行問題
- 淺談Java中return和finally的問題
- java異常處理執(zhí)行順序詳解try catch finally
- 詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序
- java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷
相關(guān)文章
Java技巧函數(shù)方法實(shí)現(xiàn)二維數(shù)組遍歷
這篇文章主要介紹了Java技巧函數(shù)方法實(shí)現(xiàn)二維數(shù)組遍歷,二維數(shù)組遍歷,每個(gè)元素判斷下是否為偶數(shù),相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-08-08
詳解Springboot集成sentinel實(shí)現(xiàn)接口限流入門
這篇文章主要介紹了詳解Springboot集成sentinel實(shí)現(xiàn)接口限流入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
SpringBoot使用Apache Tika實(shí)現(xiàn)多種文檔的內(nèi)容解析
在日常開發(fā)中,我們經(jīng)常需要解析不同類型的文檔,如PDF、Word、Excel、HTML、TXT等,Apache Tika是一個(gè)強(qiáng)大的內(nèi)容解析工具,可以輕松地提取文檔中的內(nèi)容和元數(shù)據(jù)信息,本文將通過SpringBoot和Apache Tika的結(jié)合,介紹如何實(shí)現(xiàn)對多種文檔格式的內(nèi)容解析2024-12-12
Java程序中添加播放MIDI音樂功能的實(shí)現(xiàn)方法詳解
本篇文章是對在Java程序中添加播放MIDI音樂功能的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
如何在Springboot實(shí)現(xiàn)攔截器功能
其實(shí)spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了,下面這篇文章主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)攔截器功能的相關(guān)資料,需要的朋友可以參考下2022-06-06
SpringMVC 傳日期參數(shù)到后臺(tái)的實(shí)例講解
下面小編就為大家分享一篇SpringMVC 傳日期參數(shù)到后臺(tái)的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12

