Java-異常拋出後代碼的執行情況
- 2020 年 2 月 18 日
- 筆記
一、異常被拋出但使用了try-catch
測試代碼:
public class TempTest { public static void main(String[] args) throws Exception { TestException1.method(1,2); System.out.println("----------------------分隔符-----------------------"); TestException2.method(1,2); } } class TestException1 { public static void method(int a, int b) throws Exception { if (a < b) throw new Exception("出錯!"); System.out.println(a - b); } } class TestException2 { public static void method(int a, int b) { try { if (a < b) throw new Exception("出錯!"); } catch (Exception e) { e.printStackTrace(); } System.out.println(a - b); } }
控制台輸出:
Exception in thread "main" java.lang.Exception: 出錯! at com.fisherman.TestException1.method(TempTest.java:18) at com.fisherman.TempTest.main(TempTest.java:7)
由此可見,有兩處地方的代碼因為拋出異常而沒有得到執行機會。 首先是TestException1.method
方法中System.out.println(a - b);
方法沒有得到調用,這是因為此語句上方拋出了異常,但是沒有處理,所以就沒有得到機會執行。 其次,main
方法中的
System.out.println("----------------------分隔符-----------------------"); TestException2.method(1,2);
這兩個語句沒有得到執行,這是因為TestException1.method
方法對於異常的做法就是拋出,而main
方法中調用還是沒有真正地處理這個異常,而是又將其拋出,即public static void main(String[] args) throws Exception {...}
,這樣就導致了第二處代碼沒有得到執行機會,即使TestException2.method
方法內部使用了try-catch
語句,而不是向上拋出異常。
二、使用try-catch語句處理異常
public class TempTest { public static void main(String[] args) { try { TestException1.method(1,2); } catch (Exception e) { e.printStackTrace(); } System.out.println("----------------------分隔符-----------------------"); TestException2.method(1,2); } } class TestException1 { public static void method(int a, int b) throws Exception { if (a < b) throw new Exception("出錯!"); System.out.println(a - b); } } class TestException2 { public static void method(int a, int b) { try { if (a < b) throw new Exception("出錯!"); } catch (Exception e) { e.printStackTrace(); } System.out.println(a - b); } }
控制台輸出:
java.lang.Exception: 出錯! at com.fisherman.TestException1.method(TempTest.java:24) at com.fisherman.TempTest.main(TempTest.java:8) ----------------------分隔符----------------------- java.lang.Exception: 出錯! at com.fisherman.TestException2.method(TempTest.java:34) at com.fisherman.TempTest.main(TempTest.java:13) -1
這裡就幾乎將全部代碼成功執行了。可見不管是自己手動拋出異常,還是由於調用方法的向上拋出異常,異常拋出後的代碼是否被執行取決於異常是否被catch
住處理了,簡單的拋出異常,會造成後面代碼的不執行。但是要注意,main方法中異常處理了,還是不會使異常拋出的方法TestException1.method(1,2);
體內部的System.out.println(a - b);
語句沒得到執行。