课堂动手动脑验证以及自定义异常类实现对异常处理——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()函数已运行完毕,请指示下一步动作");         }        }  }