1. 程式人生 > >當try、catch中有return時,finally中的程式碼會執行麼?

當try、catch中有return時,finally中的程式碼會執行麼?

總結:

1、不管有沒有異常,finally中的程式碼都會執行
2、當try、catch中有return時,finally中的程式碼依然會繼續執行
3、finally是在return後面的表示式運算之後執行的,此時並沒有返回運算之後的值,而是把值儲存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回儲存起來的值。也就是說方法的返回值是在finally運算之前就確定了的。
4、如果return的資料是引用資料型別,而在finally中對該引用資料型別的屬性值的改變起作用,try中的return語句返回的就是在finally中改變後的該屬性的值。
5、finally程式碼中最好不要包含return,程式會提前退出,也就是說返回的值不是try或catch中的值

先執行try中的語句,包括return後面的表示式,
有異常時,先執行catch中的語句,包括return後面的表示式,
然後執行finally中的語句,如果finally裡面有return語句,會提前退出,
最後執行try中的return,有異常時執行catch中的return。

在執行try、catch中的return之前一定會執行finally中的程式碼(如果finally存在),如果finally中有return語句,就會直接執行finally中的return方法,所以finally中的return語句一定會被執行的。編譯器把finally中的return語句標識為一個warning.

參考程式碼:TryCatchTest

// 當try、catch中有return時,finally中的程式碼會執行麼?
public class TryCatchTest {

	public static void main(String[] args) {
//		System.out.println("return的返回值:" + test());
//		System.out.println("包含異常return的返回值:" + testWithException());
		System.out.println("return的返回值:" + testWithObject().age); // 測試返回值型別是物件時
	}

	// finally是在return後面的表示式運算之後執行的,此時並沒有返回運算之後的值
	//,而是把值儲存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回儲存起來的值。
	//也就是說方法的返回值是在finally運算之前就確定了的。
	static int test() {
		int x = 1;
		try {
			return x++;
		} catch(Exception e){
			
		}finally {
			System.out.println("finally:" + x);
			++x;
			System.out.println("++x:" + x);
			// finally程式碼中最好不要包含return,程式會提前退出,
			// 也就是說返回的值不是try或catch中的值
			// return x;
		}
		return x;
	}
	
	static int testWithException(){
		Integer x = null;
		try {
			x.intValue(); // 造個空指標異常
			return x++;
		} catch(Exception e){
			System.out.println("catch:" + x);
			x = 1;
			return x; // 返回1
//			return ++x; // 返回2
		}finally {
			x = 1;
			System.out.println("finally:" + x);
			++x;
			System.out.println("++x:" + x);
			// finally程式碼中最好不要包含return,程式會提前退出,
			// 也就是說返回的值不是try或catch中的值
//			 return x;
		}
	}
	
	static Num testWithObject() {
		Num num = new Num();
		try {
			return num;
		} catch(Exception e){
			
		}finally {
			num.age++; // 改變了引用物件的值
			System.out.println("finally:" + num.age);
		}
		return num;
	}
	
	static class Num{
		public int age;
	}

}