異常處理2種方法:
1.拋 (throws)
2.自己處理try/catch/finally
1.拋出:向上一級拋出,異常實際沒有被解決掉
2.try/catch/finally
(1)正常執行
public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); test1.say(); } public void say() { String str = "123"; try { System.out.println(Integer.parseInt(str)); System.out.println("正常執行"); //return; }catch(Exception e) { System.out.println("有異常"); //return; }finally { System.out.println("finally"); //return; } } }
123 正常執行 finally
(2)異常情況:
public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); test1.say(); } public void say() { String str = "abc"; try { System.out.println(Integer.parseInt(str)); System.out.println("正常執行"); //return; }catch(Exception e) { System.out.println("有異常"); //return; }finally { System.out.println("finally"); //return; } } }
有異常 finally
結論:finally是一定會被執行的!因此,finally通常用於釋放資源,在IO流操作和數據庫操作中
程序沒有報錯,執行了 try 和 finally 代碼塊
程序報錯了,執行try catch finally 代碼塊
那么這里就有一個問題,執行的先后順序?
這里我們需要連接一個關鍵字return!
Java中的return有兩方面的用途:
(1)返回方法指定類型的值(前提是方法的返回值類型不是void)。
(2)方法的結束,它會導致當前的方法退出。
通過return我們去探究一下,try catch finally的執行先后順序!
public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); System.out.println(test1.say()); } public String say() { String str = "123"; try { Integer.parseInt(str); return "try"; } catch (Exception e) { return "catch"; } finally { return "finally"; } } }
結果為:finally
public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); System.out.println(test1.say()); } public String say() { String str = "abc"; try { Integer.parseInt(str); return "try"; } catch (Exception e) { return "catch"; } finally { return "finally"; } } }
結果也是finally
這是為什么?finally是必定執行的代碼塊!所有finally邏輯上雖然能使用return,但一般finally不會接return。否則你什么也測不出來
public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); System.out.println(test1.say()); } public String say() { String str = "abc"; try { Integer.parseInt(str); return "try"; } catch (Exception e) { System.out.println("catch"); return "catch"; } finally { System.out.println("finally"); } } }
catch finally catch
由此可以看出執行的順序為:
(1)Integer.parseInt(str);
(2)System.out.println("catch");
(3)System.out.println("finally");
(4)return "catch";
同理其他:
public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); System.out.println(test1.say()); } public String say() { String str = "abc"; try { Integer.parseInt(str); return "try"; } catch (Exception e) { System.out.println("catch"); return "catch"; } finally { System.out.println("finally"); return "finally + return"; } } }
catch finally finally + return