1. 程式人生 > >try-catch-finally執行順序及多return語句效果

try-catch-finally執行順序及多return語句效果

文字內容

1 執行過程

2 return語句



1 執行過程



2 return語句


規則:根據執行過程,最後一個執行的return語句生效,其返回值在執行相應return語句時就被確定,後續修改無效。


public static int testFinally() {
	int a = 1;
	try {
		a = 2;
		return a;
	} catch (Exception ioe) {
		a = 3;
		return a;
	} finally {
		a = 4;
		return a;
	}
}

// 返回值:4


public static int testFinally() {
	int a = 1;
	try {
		a = 2;
		return a;
	} catch (Exception ioe) {
		a = 3;
		return a;
	} finally {
		a = 4;
	}
}

// 返回值:2

原因分析:

在try塊中執行到return a,由於存在finally塊,因此,返回動作暫停,並將此時應返回的值(2)壓入棧;

執行finally塊程式碼,將變數a賦值為4;

執行完finally塊,恢復返回動作,從棧中彈出要返回的資料(2)並返回。



public static int testFinally() {
	int a = 1;
	try {
		a = 2;
		a = 1/0;  // 除數為零異常
		return a;
	} catch (Exception ioe) {
		a = 3;
		return a;
	} finally {
		a = 4;
	}
}

// 返回值:3


原因分析:

同上一例子相同,最後一次執行到的return語句發生在catch塊,當時的返回值為3。



特殊情況:

若返回的內容是引用型別(地址),則在執行最後一次return語句的時候,僅僅是確定了返回的引用值(地址)。

因此,若在finally塊中,修改該引用指向的物件,修改的內容是可以生效的。

若理解基本資料和引用在記憶體中儲存形式的相關知識,就不難理解其中的原因,其最終返回值依然是遵循之前說的規則:

最後一個執行的return語句生效,其返回值在執行相應return語句時就被確定(只是,這裡確定的是引用)。