try catch finally,try裏有return,finally研究

直接看代碼:java

代碼一:ide

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

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

結果:it

1

這說明了什麼問題?class

finally塊裏面的代碼老是在try塊return以後執行?咱們將代碼稍做修改test

代碼二:總結

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

	static int test() {
		int x = 1;
		try {
			return x;
		} finally {
			System.out.println("finally 塊執行了...");
		}
	}
}

結果:數據

finally 塊執行了...
1

此時finally塊好像又是在return以前執行的,咱們繼續修改代碼static

代碼三:di

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

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

結果:view

2

發現此時返回的是2!!!,那麼finally塊中的代碼究竟是在return以前執行呢仍是在以後和執行呢?其實二者都不是,

確切的說應該在return返回中執行,能夠這樣理解,在try塊中的代碼return以後,會將return的值存儲到數據棧中,此時

並未徹底返回,而後去執行finally塊,在代碼一中,執行finally快的時候,數據棧中已經存儲了return的值爲1,即便

++x也不能改變返回值了,而代碼二中,儘管數據棧中已經存儲了return的值爲1,可是在執行finally塊的時候又return了一次,

直接覆蓋了數據棧中的1變爲了++x,即2。

所以作以總結,finally塊是在try塊還未徹底return的時候執行的!!執行完finally塊以後纔會徹底返回。

相關文章
相關標籤/搜索