1. 程式人生 > >面試題之final,finally和finalize的區別以及如果catch裡面有return語句,請問finally裡面的程式碼還會執行嗎?

面試題之final,finally和finalize的區別以及如果catch裡面有return語句,請問finally裡面的程式碼還會執行嗎?

/*
 * 面試題:
 * 1:final,finally和finalize的區別
 * final:最終的意思,可以修飾類,成員變數,成員方法
 *         修飾類,類不能被繼承
 *         修飾變數,變數是常量
 *         修飾方法,方法不能被重寫
 * finally:是異常處理的一部分,用於釋放資源。
 *         一般來說,程式碼肯定會執行,特殊情況:在執行到finally之前jvm退出了
 * finalize:是Object類的一個方法,用於垃圾回收
 *
 * 2:如果catch裡面有return語句,請問finally裡面的程式碼還會執行嗎?
 *   如果會,請問是在return前,還是return後。
 *       面試回答: 會。前。
 *
 *      準確的說,應該是在中間。
 *
 * 3:try...catch...finally的格式變形
 *         A:try...catch...finally
 *         B:try...catch
 *         C:try...catch...catch...
 *         D:try...catch...catch...finally
 *         E:try...finally
 *             這種做法的目前是為了釋放資源。

 */

package 異常;


public class FinallyDemo2 {
	public static void main(String[] args) {
		System.out.println(getInt());// 返回30
	}

	public static int getInt() {
		int a = 10;
		try {
			System.out.println(a / 0);// 分母除0丟擲異常
			a = 20;// 不會執行
		} catch (ArithmeticException e) {
			a = 30;
			// System.exit(0);
			return a; // 形成返回路徑return 30,而不是return a
			/*
			 * return a在程式執行到這一步的時候,這裡不是return a而是return 30;這個返回路徑就形成了。
			 * 但是呢,它發現後面還有finally,所以繼續執行finally的內容,a=40 再次回到以前的返回路徑,繼續走return
			 * 30;
			 */
		} finally {
			a = 40;
			System.out.println("a=" + a);// 會輸出40,單此時的a已經不會和上面發生關係了
			// return a;// 如果這樣結果就是40了。
		}
		//其實在下面的兩句程式碼在執行的時候不會執行,如果不寫會報錯,因為不一定會執行catch,就沒有了return 語句
		System.out.println("a=" + a);
		return a;// 返回的是30
	}
}