国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 後端開發(fā) php教程 try-catch-finally的執(zhí)行順序是什么

try-catch-finally的執(zhí)行順序是什么

Jun 13, 2016 pm 12:03 PM
catch finally return try

try-catch-finally的執(zhí)行順序是:1、不管有沒有出現(xiàn)異常,finally塊中的代碼都會執(zhí)行;2、當(dāng)try和catch中有return時,finally仍然會執(zhí)行;3、finally是在return后面的表達(dá)式運(yùn)算后執(zhí)行的。

try-catch-finally的執(zhí)行順序是什么

try catch finally 執(zhí)行順序結(jié)論

1、不管有沒有出現(xiàn)異常,finally塊中代碼都會執(zhí)行;

2、當(dāng)try和catch中有return時,finally仍然會執(zhí)行;

3、finally是在return后面的表達(dá)式運(yùn)算后執(zhí)行的(此時并沒有返回運(yùn)算后的值,而是先把要返回的值保存起來,不管finally中的代碼怎么樣,返回的值都不會改變,任然是之前保存的值),所以函數(shù)返回值是在finally執(zhí)行前確定的;

4、finally中最好不要包含return,否則程序會提前退出,返回值不是try或catch中保存的返回值。

測試案例1

public class FinallyTest  
{
	public static void main(String[] args) {
		 
		System.out.println(new FinallyTest().test());;
	}

	static int test()
	{
		int x = 1;
		try
		{
			x++;
			return x;
		}
		finally
		{
			++x;
		}
	}
}

結(jié)果是

2

分析:

在try語句中,在執(zhí)行return語句時,要返回的結(jié)果已經(jīng)準(zhǔn)備好了,就在此時,程序轉(zhuǎn)到finally執(zhí)行了。

在轉(zhuǎn)去之前,try中先把要返回的結(jié)果存放到不同于x的局部變量中去,執(zhí)行完finally之后,在從中取出返回結(jié)果,

因此,即使finally中對變量x進(jìn)行了改變,但是不會影響返回結(jié)果。

測試案例2

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            System.out.println("try block, i = "+i);
        }catch(Exception e){
            i ++;
            System.out.println("catch block i = "+i);
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
        }
        return i;
}

沒錯,會按照順序執(zhí)行,先執(zhí)行try內(nèi)代碼段,沒有異常的話進(jìn)入finally,最后返回,那么輸出如下:

try block, i = 2
finally block i = 10
main test i = 10

測試案例3

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            i ++;
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
        }
}

輸出結(jié)果是:

try block, i = 2
finally block i = 10
main test i = 2

代碼順序執(zhí)行從try到finally,由于finally是無論如何都會執(zhí)行的,所以try里的語句并不會直接返回。在try語句的return塊中,return返回的引用變量并不是try語句外定義的引用變量i,而是系統(tǒng)重新定義了一個局部引用i’,這個引用指向了引用i對應(yīng)的值,也就是2,即使在finally語句中把引用i指向了值10,因?yàn)閞eturn返回的引用已經(jīng)不是i,而是i’,所以引用i的值和try語句中的返回值無關(guān)了。

但是,這只是一部分,如果把i換成引用類型而不是基本類型呢,來看看輸出結(jié)果怎樣,示例如下:

public static  List<Object> testWrap(){
        List<Object> list = new ArrayList<>();
        try{
            list.add("try");
            System.out.println("try block");
            return list;
        }catch(Exception e){
            list.add("catch");
            System.out.println("catch block");
            return list;
        }finally{
            list.add("finally");
            System.out.println("finally block ");
        }
}

打印結(jié)果如下:

try block
finally block
main test i = [try, finally]

可以看到,finally里對list集合的操作生效了,這是為什么呢。我們知道基本類型在棧中存儲,而對于非基本類型是存儲在堆中的,返回的是堆中的地址,因此內(nèi)容被改變了。

好了,現(xiàn)在我們在finally里加一個return,看看語句是從哪里返回的。

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            i ++;
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
            return i;
        }
}

輸出結(jié)果如下:

try block, i = 2
finally block i = 10
main test i = 10

可以看到,是從finally語句塊中返回的??梢?,JVM是忽略了try中的return語句。但I(xiàn)DE中會對finally中加的return有黃色警告提示,這是為什么呢,在try里加入一行會執(zhí)行異常的代碼,如下:

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            int m = i / 0 ;
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            i ++;
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
            return i;
        }
}

打印結(jié)果如下:

catch block i = 3
finally block i = 10
main test i = 10

可以看到,因?yàn)閒inally中有return語句,try、catch中的異常被消化掉了,屏蔽了異常的發(fā)生,這與初期使用try、catch的初衷是相違背的,因此編譯器也會提示警告。

那如果在finally中有異常發(fā)生,會對try、catch中的異常有什么影響呢?

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            Integer.parseInt(null);
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            String.valueOf(null);
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            int m = i / 0;
            System.out.println("finally block i = "+i);
        }
}

這里我們在try、catch里強(qiáng)行加上異常語句,打印結(jié)果如下:

Exception in thread “main” java.lang.ArithmeticException: / by zero
at tryandcatch.TryAndCatch.testBasic(TryAndCatch.java:25)
at tryandcatch.TryAndCatch.main(TryAndCatch.java:45)

這個提示表示的是finally里的異常信息,也就是說一旦finally里發(fā)生異常,try、catch里的異常信息即被消化掉了,也達(dá)不到異常信息處理的目的。

總結(jié)以上測試:

1、finally語句總會執(zhí)行

2、如果try、catch中有return語句,finally中沒有return,那么在finally中修改除包裝類型和靜態(tài)變量、全局變量以外的數(shù)據(jù)都不會對try、catch中返回的變量有任何的影響(包裝類型、靜態(tài)變量會改變、全局變量)

3、盡量不要在finally中使用return語句,如果使用的話,會忽略try、catch中的返回語句,也會忽略try、catch中的異常,屏蔽了錯誤的發(fā)生

4、finally中避免再次拋出異常,一旦finally中發(fā)生異常,代碼執(zhí)行將會拋出finally中的異常信息,try、catch中的異常將被忽略

所以在實(shí)際項(xiàng)目中,finally常常是用來關(guān)閉流或者數(shù)據(jù)庫資源的,并不額外做其他操作。

更多相關(guān)知識,請訪問?PHP中文網(wǎng)!!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C語言return的用法詳解 C語言return的用法詳解 Oct 07, 2023 am 10:58 AM

C語言return的用法有:1、對於傳回值類型為void的函數(shù),可以使用return語句來提前結(jié)束函數(shù)的執(zhí)行;2、對於傳回值型別不為void的函數(shù),return語句的作用是將函數(shù)的執(zhí)行結(jié)果傳回給呼叫者;3、提前結(jié)束函數(shù)的執(zhí)行,在函數(shù)內(nèi)部,我們可以使用return語句來提前結(jié)束函數(shù)的執(zhí)行,即使函數(shù)並沒有回傳值。

Java中final、finally、finalize的區(qū)別 Java中final、finally、finalize的區(qū)別 Feb 19, 2024 pm 12:16 PM

Java中final、finally、finalize的區(qū)別,需要具體程式碼範(fàn)例在Java程式設(shè)計中,經(jīng)常會遇到final、finally、finalize這三個關(guān)鍵字,它們雖然拼字相似,但卻有不同的意思和用法。本文將詳細(xì)解釋這三個關(guān)鍵字的區(qū)別,同時給出程式碼範(fàn)例以幫助讀者更好地理解。一、final關(guān)鍵字final關(guān)鍵字可以用於類別、方法和變數(shù)。它的作用是使被修飾的類

Java中return和finally語句的執(zhí)行順序是怎樣的? Java中return和finally語句的執(zhí)行順序是怎樣的? Apr 25, 2023 pm 07:55 PM

原始碼:publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}#輸出上述程式碼的輸出可以簡單地得出結(jié)論:return在finally之前執(zhí)行,我們來看下字節(jié)碼層面上發(fā)生了什麼事情。下面截取case1方法的部分字節(jié)碼,並且對照源碼,將每個指令的含義註釋在

在 Windows 11 上修復(fù)音訊服務(wù)無回應(yīng)問題的 18 種方法 在 Windows 11 上修復(fù)音訊服務(wù)無回應(yīng)問題的 18 種方法 Jun 05, 2023 pm 10:23 PM

音訊輸出和輸入需要特定的驅(qū)動程式和服務(wù)才能在Windows11上按預(yù)期工作。這些有時最終會在後臺遇到錯誤,從而導(dǎo)致音訊問題,如無音訊輸出、缺少音訊設(shè)備、音訊失真等。如何修復(fù)在Windows11上沒有回應(yīng)的音訊服務(wù)我們建議您從下面提到的修復(fù)開始,並逐步完成列表,直到您設(shè)法解決您的問題。由於Windows11上的多種原因,音訊服務(wù)可能無法回應(yīng)。此清單將幫助您驗(yàn)證和修復(fù)阻止音訊服務(wù)在Windows11上回應(yīng)的大多數(shù)問題。請按照以下相關(guān)部分幫助您完成流程。方法一:重啟音訊服務(wù)您可能會遇

使用JavaScript中return關(guān)鍵字 使用JavaScript中return關(guān)鍵字 Feb 18, 2024 pm 12:45 PM

JavaScript中return的用法,需要具體程式碼範(fàn)例在JavaScript中,return語句用來指定從函數(shù)傳回的值。它不僅可以用於結(jié)束函數(shù)的執(zhí)行,還可以將一個值傳回給呼叫函數(shù)的地方。 return語句有以下幾個常見的用法:傳回一個值return語句可以用來傳回一個值給呼叫函數(shù)的地方。下面是一個簡單的範(fàn)例:functionadd(a,b){

Vue3怎麼使用setup語法糖拒絕寫return Vue3怎麼使用setup語法糖拒絕寫return May 12, 2023 pm 06:34 PM

Vue3.2setup語法糖是在單文件組件(SFC)中使用組合式API的編譯時語法糖解決Vue3.0中setup需要繁瑣將聲明的變量、函數(shù)以及import引入的內(nèi)容通過return向外暴露,才能在使用的問題1.在使用中無需return宣告的變數(shù)、函數(shù)以及import引入的內(nèi)容,即可在使用語法糖//import引入的內(nèi)容import{getToday}from'./utils'//變數(shù)constmsg='Hello !'//函數(shù)func

詳解JavaScript函數(shù)傳回值和return語句 詳解JavaScript函數(shù)傳回值和return語句 Aug 04, 2022 am 09:46 AM

JavaScript 函數(shù)提供兩個介面實(shí)現(xiàn)與外界的交互,其中參數(shù)作為入口,接收外界資訊;返回值作為出口,並將運(yùn)算結(jié)果回饋給外界。以下這篇文章帶大家了解JavaScript函數(shù)回傳值,淺析下return語句的用法,希望對大家有幫助!

C中的try和catch使用方法 C中的try和catch使用方法 Feb 21, 2024 am 09:03 AM

C中的try和catch使用方法,需要具體程式碼範(fàn)例在C語言中,沒有內(nèi)建的try和catch機(jī)制用於異常處理。然而,可以透過使用setjmp和longjmp函數(shù)來模擬try和catch的功能。下面我將詳細(xì)介紹如何使用這兩個函數(shù)進(jìn)行異常處理,並給出對應(yīng)的程式碼範(fàn)例。首先,我們需要了解setjmp和longjmp函數(shù)的原理。 setjmp函數(shù)被呼叫時,會保存目前程式的

See all articles