直接上代碼,先貼下面測試須要調用的方法:java
public static void enterTryMethod() { System.out.println("enter after try field"); } public static void enterExceptionMethod() { System.out.println("enter catch field"); } public static void enterFinallyMethod() { System.out.println("enter finally method"); }
1. 拋出Exception,沒有finally,當catch趕上returnweb
public static int catchTest() { int res = 0; try { res = 10 / 0; // 拋出Exception,後續處理被拒絕 enterTryMethod(); return res; // Exception已經拋出,沒有得到被執行的機會 } catch (Exception e) { enterExceptionMethod(); return 1; // Exception拋出,得到了調用方法並返回方法值的機會 } }
後臺輸出結果:測試
enter catch field 1
2. 拋出Exception,當catch體裏有return,finally體的代碼塊將在catch執行return以前被執行spa
public static int catchTest() { int res = 0; try { res = 10 / 0; // 拋出Exception,後續處理被拒絕 enterTryMethod(); return res; // Exception已經拋出,沒有得到被執行的機會 } catch (Exception e) { enterExceptionMethod(); return 1; // Exception拋出,得到了調用方法並返回方法值的機會 } finally { enterFinallyMethod(); // Exception拋出,finally代碼將在catch執行return以前被執行 } }
後臺輸出結果:code
enter catch field enter finally method 1
3. 不拋出Exception,當finally代碼塊裏面趕上return,finally執行完後將結束整個方法orm
public static int catchTest() { int res = 0; try { res = 10 / 2; // 不拋出Exception enterTryMethod(); return res; // 得到被執行的機會,但執行須要在finally執行完成以後才能被執行 } catch (Exception e) { enterExceptionMethod(); return 1; } finally { enterFinallyMethod(); return 1000; // finally中含有return語句,這個return將結束這個方法,不會在執行完以後再跳回try或者catch繼續執行,方法到此結束 } }
後臺輸出結果:it
enter after try field enter finally method 1000
4. 不拋Exception,當finally代碼塊裏面趕上System.exit()方法將結束和終止整個程序,而不僅是方法io
public static int catchTest() { int res = 0; try { res = 10 / 2; // 不拋出Exception enterTryMethod(); return res; // 得到被執行的機會,但因爲finally已經終止程序,返回值沒有機會被返回 } catch (Exception e) { enterExceptionMethod(); return 1; } finally { enterFinallyMethod(); System.exit(0); // finally中含有System.exit()語句,System.exit()將退出整個程序,程序將被終止 } }
後臺輸出結果:class
enter after try field enter finally method
5. 拋出Exception,當catch和finally同時趕上return,catch的return返回值將不會被返回,finally的return語句將結束整個方法並返回import
public static int catchTest() { int res = 0; try { res = 10 / 0; // 拋出Exception,後續處理將被拒絕 enterTryMethod(); return res; // Exception已經拋出,沒有得到被執行的機會 } catch (Exception e) { enterExceptionMethod(); return 1; // Exception已經拋出,得到被執行的機會,但返回操做將被finally截斷 } finally { enterFinallyMethod(); return 10; // return將結束整個方法,返回值爲10 } }
後臺輸出結果:
enter catch field enter finally method 10
6. 不拋出Exception,當finally趕上return,try的return返回值將不會被返回,finally的return語句將結束整個方法並返回
public static int catchTest() { int res = 0; try { res = 10 / 2; // 不拋出Exception enterTryMethod(); return res; // 得到執行機會,但返回將被finally截斷 } catch (Exception e) { enterExceptionMethod(); return 1; } finally { enterFinallyMethod(); return 10; // return將結束整個方法,返回值爲10 } }
後臺輸出結果:
enter after try field enter finally method 10
Java的異常處理中,程序執行完try裏面的代碼塊以後,該方法並不會當即結束,而是繼續試圖去尋找該方法有沒有finally的代碼塊
若是沒有finally代碼塊,整個方法在執行完try代碼塊後返回相應的值來結束整個方法
若是有finally代碼塊,此時程序執行到try代碼塊裏的return一句之時並不會當即執行return,而是先去執行finally代碼塊裏的代碼
若finally代碼塊裏沒有return或沒有可以終止程序的代碼,程序在執行完finally代碼塊代碼以後再返回try代碼塊執行return語句來結束整個方法。若 finally 代碼塊裏有 return 或含有可以終止程序的代碼,方法將在執行完 finally 以後被結束,再也不跳回 try 代碼塊執行 return
在拋出異常的狀況下,原理也是和上面的同樣的,你把上面說到的 try 換成 catch 去理解就OK了。