什么是异常

  • 软件程序在运行过程中,遇到的情况不可能是非常完美的,可能会存在各种问题,我们称为异常,英文:Exception,要让我们写出的程序作出合理的处理,而不至于程序崩溃。异常发生在程序运行期间,它影响了正常程序的执行流程。
  • 异常分类:
    1. 检查性异常
    2. 运行时异常
    3. 错误ERROR

异常处理机制

  • 抛出异常

  • 捕获异常

  • 异常处理五个关键字

  • try,catch,finally,throw,throws

  • Demo.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package cool.exception;

    public class Demo1 {
    public static void main(String[] args) {
    int a = 1;
    int b = 0;

    //假设要捕获多个异常:从小到大!
    try { //try监控区域
    System.out.println(a/b);
    }catch (Error e){ //catch(想要捕获的异常类型) 捕获异常
    System.out.println("错误");
    }catch (ArithmeticException e){
    System.out.println("程序出现异常,变量b不能为0");
    }catch (Throwable t){ //Throwable是最高层级的异常
    System.out.println("。。。");
    }finally { //处理善后工作
    System.out.println("finally");
    }//程序出现异常,变量b不能为0
    } //finally
    }
    //finally 可以不要finally,假设IO,资源,关闭!
  • IDEA快捷键:Ctrl + Alt +T 将选中部分代码用代码块包裹起来!

  • Demo2.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package cool.exception;

    public class Demo2 {
    public static void main(String[] args) {
    int a = 1;
    int b = 0;
    try {
    System.out.println(a/b);
    }catch (Exception e){
    System.exit(0);//终止程序0,1,2,3,4...都可以
    e.printStackTrace();//打印错误的栈信息
    }finally {

    }
    }
    }
  • Demo3.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package cool.exception;

    public class Demo3 {
    public static void main(String[] args) {
    new Demo3().test(1,0);
    }
    //假设这个方法中处理不了这个异常,方法向上抛出
    //方法中用throw,方法外用throws
    public void test(int a,int b) throws ArithmeticException{
    if (b == 0){
    throw new ArithmeticException();//主动的抛出异常,一般在方法中使用
    }
    }
    }

自定义异常

  • 用户自定义异常类,只需继承Exception类即可

  • MyException.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package cool.exception.Ex;

    //自定义的异常类
    public class MyException extends Exception{
    //传递数字>10;
    private int detail;

    public MyException(int a) {
    this.detail = a;
    }
    //toString:异常的打印信息
    @Override
    public String toString() {
    return "MyException{" + detail + '}';
    }
    }
  • Test.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package cool.exception.Ex;

    public class Test {
    //可能会存在异常的方法
    static void test(int a) throws MyException {
    System.out.println("传递的参数为:" + a);
    if (a>10){
    throw new MyException(a); //抛出
    }
    System.out.println("OK");
    }

    public static void main(String[] args) {
    try {
    test(11);
    }catch (MyException e){
    System.out.println("MyException=>"+e);
    }
    }//传递的参数为:11
    } //MyException=>MyException{11}
  • 实际应用中的经验总结

    • 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理

    • 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常

    • 对于不确定的代码,也可以加一个try-catch,处理潜在的异常

      IDEA快捷键:Alt + Enter会提示异常的处理操作

    • 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出

    • 具体如何处理异常,要根据不同的业务需求和异常类型去决定

    • 尽量添加finally语句去释放占用的资源