java異常處理執行順序詳解try catch finally
不含return的執行順序
執行順序為執行try中代碼,如果沒有異常,然後執行try catch後續的代碼。如:
public static void main(String[] args) { try { int j = 10 / 2; System.out.println("執行try中代碼!"); } catch (Exception e) { e.printStackTrace(); System.out.println("執行catch中代碼!"); } System.out.println("執行catch後的代碼!"); }
執行結果為:
如果有異常,則try中異常後的代碼將不執行,開始執行catch中的代碼,執行完成後,執行try catch後續的代碼,示例代碼如下:
public static void main(String[] args) { try { int j = 10 / 0; System.out.println("執行try中代碼!"); } catch (Exception e) { e.printStackTrace(); System.out.println("執行catch中代碼!"); } System.out.println("執行catch後的代碼!"); }
執行結果
發生異常語句後的代碼:System.out.println(“執行try中代碼!”)不再執行。
finally子句
使用try catch finally子句時,無論發生不發生異常,finally子句中的代碼都是要執行,一般用於釋放資源、連接等操作。
public static void main(String[] args) { try { int i = 8/0; System.out.println("執行try中代碼!"); } catch (Exception e) { System.out.println("執行catch中代碼!"); } finally { System.out.println("執行finally中代碼!"); } System.out.println("執行try catch後的代碼!"); }
執行try catch或try catch finally之後,執行後續的代碼。
含return的執行順序
如果不包含finally語句,在try子句和catch子句中均含有return語句,代碼遇到return語句則終止代碼的執行,try catch後面的語句不可能得到執行。
含有finally語句的try catch子句包含return語句執行順序,執行finally子句,然後執行try或者catch的return語句,此時若finally語句包含return或終止運行,則try catch子句中的return語句將不執行。如:
public static void main(String[] args) { Integer i= testReturn(); System.out.println(i); } public static Integer testReturn(){ try { int i = 8/0; System.out.println("執行try中代碼!"); return 1; } catch (Exception e) { System.out.println("執行catch中代碼!"); return 0; } finally { System.out.println("執行finally中代碼!"); return 3; } }
執行結果
如果再finally終止程序運行,則丟失返回值
public static void main(String[] args) { Integer i= testReturn(); System.out.println(i); } public static Integer testReturn(){ try { int i = 8/0; System.out.println("執行try中代碼!"); return 1; } catch (Exception e) { System.out.println("執行catch中代碼!"); return 0; } finally { System.out.println("執行finally中代碼!"); System.exit(0); //退出程序,返回值丟失 } }
執行結果如下圖:
沒有輸出返回值
返回類型是對象類型時值的變化
返回類型如果是對象類型,則返回的是指針。此時如果finally中包含對象的炒作,註意返回值的變化。示例代碼如下
創建一個Person的類
public class Person { private String name; private String adress; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", adress='" + adress + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } }
含有return的測試代碼如下
public static void main(String[] args) { Person person = testObjReturn(); System.out.println(person.toString()); } public static Person testObjReturn(){ Person person = new Person(); try { int i = 8/0; person.setName("王小二"); person.setAdress("電子街1號"); return person; } catch (Exception e) { person.setName("朱小三"); person.setAdress("電子街1號"); return person; } finally { person.setName("李老五");; } }
執行結果
結論
try catch finally帶有return語句時,既可以將return語句放到try和catch中,也可以放到過程的結尾,一般建議放到結尾,便於統一管理。特別註意finally包含return語句時try、catch中的return將不再執行。尤其當返回的變量是實體對象時,finally中的語句如果對返回的變量進行修改,則將影響到返回值。
以上就是java異常處理執行順序詳解try catch finally的詳細內容,更多關於java異常try catch finally執行順序的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- java中類和對象的詳細介紹
- Java基礎之finally語句與return語句詳解
- 手把手帶你粗略瞭解Java–類和對象
- Java雜談之類和對象 封裝 構造方法以及代碼塊詳解
- 一文帶你瞭解Java中的Object類及類中方法