面試題之final,finally和finalize的區別以及如果catch裡面有return語句,請問finally裡面的程式碼還會執行嗎?
阿新 • • 發佈:2018-12-30
/*
* 面試題:
* 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
* 這種做法的目前是為了釋放資源。
* 面試題:
* 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 } }