課堂動手動腦驗證以及自定義異常類實現對異常處理——java異常類

  • 2019 年 11 月 1 日
  • 筆記

異常(exception):發生在程式執行期間,表明出現了一個非法運行的情況。許多JDK中的方法在檢測到非法情況時,都會拋出一個異常對象。例如:數組越界和被0除。

程式碼驗證:

package test;    import javax.swing.*;    class AboutException {     public static void main(String[] a)     {        int i=1, j=0, k;      try      {            k = i/j;    // Causes division-by-zero exception          //throw new Exception("Hello.Exception!");      }        catch ( ArithmeticException e)      {          System.out.println("被0除.  "+ e.getMessage());      }        catch (Exception e)      {          if (e instanceof ArithmeticException)              System.out.println("被0除");          else          {              System.out.println(e.getMessage());            }      }          finally       {               JOptionPane.showConfirmDialog(null,"OK");       }      }  }

輸出結果:

 

當java程式中出現多try catch的情況時,一定要注意程式執行的先後順序。

多try catch的java異常處理程式碼一

package test;    public class CatchWho {      public static void main(String[] args) {          try {                  try {                      throw new ArrayIndexOutOfBoundsException();                  }                  catch(ArrayIndexOutOfBoundsException e) {                         System.out.println(  "ArrayIndexOutOfBoundsException" +  "/內層try-catch");                  }                throw new ArithmeticException();          }          catch(ArithmeticException e) {              System.out.println("發生ArithmeticException");          }          catch(ArrayIndexOutOfBoundsException e) {             System.out.println(  "ArrayIndexOutOfBoundsException" + "/外層try-catch");          }      }  }

程式運行結果:

多try catch的java異常處理程式碼二

package test;    public class CatchWho2 {      public static void main(String[] args) {          try {                  try {                      throw new ArrayIndexOutOfBoundsException();                  }                  catch(ArithmeticException e) {                      System.out.println( "ArrayIndexOutOfBoundsException" + "/內層try-catch");                  }              throw new ArithmeticException();          }          catch(ArithmeticException e) {              System.out.println("發生ArithmeticException");          }          catch(ArrayIndexOutOfBoundsException e) {              System.out.println( "ArrayIndexOutOfBoundsException" + "/外層try-catch");          }      }  }

程式運行結果:

當有多個try catch finally嵌套 時,要特別注意finally的執行時機。特別注意:當有多層嵌套的finally時,異常在不同的層次拋出,在不同的位置拋出,可能會導致不同的finally語句的執行順序。再者,我們一般認為finally語句中的句子一定會被執行,這裡的一定是相對而言的,並不是絕對的。例如以下程式程式碼的運行:

package test;    public class SystemExitAndFinally {          public static void main(String[] args)      {            try{                  System.out.println("in main");                throw new Exception("Exception is thrown in main");                        //System.exit(0);              }            catch(Exception e)                {                System.out.println(e.getMessage());                System.exit(0);            }            finally            {                System.out.println("in finally");            }        }      }

運行結果:

在這段java程式碼中finally語句塊並沒有執行。

 

通過過異常的學習,自己嘗試了自定義了一個異常類來處理異常,源碼如下:

package classtest;    import java.util.Scanner;    class Myexception extends Exception {      public Myexception(String message) {          super(message);      }  }    public class Mytest {        public static void main(String[] args) throws Exception{          // TODO Auto-generated method stub          try{              function();          }          catch (Exception e) {              System.out.println(e.getMessage());              System.out.println("main()函數運行時出現異常");          }          finally {              System.out.println("main()函數運行完畢");          }      }        public static int judge(String str) {          int c = 0;          String regex = "[0-9]+";          String regex1="[-][0-9]+";          boolean d = str.matches(regex);          boolean e = str.matches(regex1);          if (d == false) {              c = 1;              if (e == true) {                  c = 0;              }          }          return c;      }        public static void function() {          try {              System.out.println("請輸入一個正整數:");              Scanner input = new Scanner(System.in);              String a = input.next();              int temp = judge(a);              if (temp == 1) {                  throw new Myexception("不能輸入非法字元");              } else {                  int num = Integer.parseInt(a);                  if (num < 0)                      throw new Myexception("輸入不能為負數");                  else if (num == 0) {                      throw new Myexception("正整數不包括0");                  }              }            } catch (Myexception f) {              System.out.println(f.getMessage());          } catch (Exception e) {              System.out.println(e.getMessage());              System.out.println("function()函數運行時出現異常");          }         finally {             System.out.println("function()函數已運行完畢,請指示下一步動作");         }        }  }