异常的捕获及处理

2020-11-10  本文已影响0人  曾梦想仗剑天涯

认识异常对程序的影响

//没有异常产生的程序
package demo;
public class JavaDemo {
  public static void main(String [] args) {
    System.out.println("***** 程序开始执行 *******");
    System.out.println("***** 数学计算:" + (10 / 2));
    System.out.println("***** 程序执行完毕 *******");
  }
}
//产生异常的程序
package demo;
public class JavaDemo {
  public static void main(String [] args) {
    System.out.println("***** 程序开始执行 *******");
    System.out.println("***** 数学计算:" + (10 / 0));
    System.out.println("***** 程序执行完毕 *******");
  }
}
***** 程序开始执行 *******
Exception in thread "main" java.lang.ArithmeticException: / by zero
at demo.JavaDemo.main(JavaDemo.java:5)

处理异常

try {
  //可能出现异常的语句
} [catch(异常类型 异常对象) {
  //异常处理
} catch(异常类型 异常对象) {
  //异常处理
} catch(异常类型 异常对象) {
  //异常处理
} ...] [finally {
  //不管异常是否处理都要执行
}]
//处理异常
package demo;
public class JavaDemo {
  public static void main(String [] args) {
    System.out.println("***** 程序开始执行 *******");
    try {
      System.out.println("***** 数学计算:" + (10 / 0));
    } catch (ArithmeticException e) {
      System.out.println(e);
    }
    System.out.println("***** 程序执行完毕 *******");
  }
}
***** 程序开始执行 *******
java.lang.ArithmeticException: / by zero
***** 程序执行完毕 *******
//获取完整异常信息
package demo;
public class JavaDemo {
  public static void main(String [] args) {
    System.out.println("***** 程序开始执行 *******");
    try {
      System.out.println("***** 数学计算:" + (10 / 0));
    } catch (ArithmeticException e) {
      e.printStackTrace();
    }
    System.out.println("***** 程序执行完毕 *******");
  }
}
//使用finally语句
package demo;
public class JavaDemo {
  public static void main(String [] args) {
    System.out.println("***** 程序开始执行 *******");
    try {
      System.out.println("***** 数学计算:" + (10 / 0));
    } catch (ArithmeticException e) {
      e.printStackTrace();
    } finally {
      System.out.println("不管是否出现异常都执行");
    }
    System.out.println("***** 程序执行完毕 *******");
  }
}

处理多个异常

package demo;
public class JavaDemo {
  public static void main(String [] args) {
    System.out.println("***** 程序开始执行 *******");
    try {
      int x = Integer.parseInt(args[0]);
      int y = Integer.parseInts(args[1]);
      System.out.println("***** 数学计算:" + (x / y));
    } catch (ArithmeticException e) {
      e.printStackTrace();
    } finally {
      System.out.println("不管是否出现异常都执行");
    }
    System.out.println("***** 程序执行完毕 *******");
  }
}
程序执行结果
***** 程序开始执行 ******* 不管是否出现异常都执行 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0at demo.JavaDemo.main(JavaDemo.java:6)
程序执行结果
***** 程序开始执行 ******* 不管是否出现异常都执行 Exception in thread "main" java.lang.NumberFormatException: For input string: "a" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at demo.JavaDemo.main(JavaDemo.java:6)
程序执行结果
***** 程序开始执行 ******* java.lang.ArithmeticException: / by zero at demo.JavaDemo.main(JavaDemo.java:8) 不管是否出现异常都执行 ***** 程序执行完毕 *******
package demo;
public class JavaDemo {
  public static void main(String [] args) {
    System.out.println("***** 程序开始执行 *******");
    try {
      int x = Integer.parseInt(args[0]);
      int y = Integer.parseInt(args[1]);
      System.out.println("***** 数学计算:" + (x / y));
    } catch (ArithmeticException e) {
      e.printStackTrace();
    } catch (ArrayIndexOutOfBoundsException e) {
      e.printStackTrace();
    } catch (NumberFormatException e) {
      e.printStackTrace();
    } finally {
      System.out.println("不管是否出现异常都执行");
    }
    System.out.println("***** 程序执行完毕 *******");
  }
}

异常处理流程

此图来源于李兴华老师
NumberFormatException ArrayIndexOutOfBoundsException
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.IllegalArgumentException
java.lang.NumberFormatException
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.IndexOutOfBoundsException
java.lang.ArrayIndexOutOfBoundsException
package demo;
public class JavaDemo {
  public static void main(String [] args) {
    System.out.println("***** 程序开始执行 *******");
    try {
      int x = Integer.parseInt(args[0]);
      int y = Integer.parseInt(args[1]);
      System.out.println("***** 数学计算:" + (x / y));
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      System.out.println("不管是否出现异常都执行");
    }
    System.out.println("***** 程序执行完毕 *******");
  }
}

throws关键字

//观察throws的使用
package demo;
class MyMath {
  //这个代码执行的时候可能会产生异常,如果产生异常了调用处处理
  public static int div(int x, int y) throws Exception {
    return x / y ;
  }
}
public class JavaDemo {
  public static void main(String [] args) {
    try {
      System.out.println(MyMath.div(10, 0));
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}
//在主方法上继续抛出异常
package demo;
class MyMath {
  //这个代码执行的时候可能会产生异常,如果产生异常了调用处处理
  public static int div(int x, int y) throws Exception {
    return x / y ;
  }
}
public class JavaDemo {
  public static void main(String [] args) throws Exception {
    System.out.println(MyMath.div(10, 0));
  }
}

throw关键字

//观察throw的使用
package demo;
public class JavaDemo {
  public static void main(String [] args) {
    try {   //异常对象不再由系统生成,而是手工定义的
      throw new Exception("自己抛着玩的对象");
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

异常处理的标准格式

    现在要求定义一个除法计算的方法,在这个方法之中,开发要求如下:

package demo;
class MyMath {
  public static int div(int x, int y) throws Exception {
    int temp = 0;
    System.out.println("除法计算开始");
    try {
      temp = x / y;
    } catch(Exception e) {
      throw e;
    } finally {
      System.out.println("除法计算结束");
    }
    return temp;
  }
}
public class JavaDemo {
  public static void main(String [] args) throws Exception {
    try {
      System.out.println(MyMath.div(10, 0));
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}
package demo;
class MyMath {
  public static int div(int x, int y) throws Exception {
    int temp = 0;
    System.out.println("除法计算开始");
    try {
      temp = x / y;
    } finally {
      System.out.println("除法计算结束");
    }
    return temp;
  }
}
public class JavaDemo {
  public static void main(String [] args) throws Exception {
    try {
      System.out.println(MyMath.div(10, 0));
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

RuntimeException

package demo;
public class JavaDemo {
  public static void main(String [] args) {
    int num = Integer.parseInt("1213");
    System.out.println(num);
  }
}
NumberFormatException ArithmeticException
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.IllegalArgumentException
java.lang.NumberFormatException
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.ArithmeticException

自定义异常类

//实现自定义异常
package demo;
class BombException extends Exception {
  public BombException(String msg) {
    super(msg);
  }
}
class Food {
  public static void eat(int num) throws BombException {
    if(num > 10) {
      throw new BombException("吃太多了");
    } else {
      System.out.println("正常吃");
    }
  }
}
public class JavaDemo {
  public static void main(String [] args) throws Exception {
    Food.eat(11);
  }
}

assert关键字

//断言的使用
package demo;
public class JavaDemo {
  public static void main(String [] args) throws Exception {
    int x = 10;
    //中间经历了很多的x变量的操作步骤
    assert x == 100 : "x的内容不是100";
  }
}
java -ea JavaDemo Exception in thread "main" java.lang.AssertionError: x的内容不是100 at demo.JavaDemo.main(JavaDemo.java:7)
上一篇下一篇

猜你喜欢

热点阅读