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);語句沒得到執行。