li

XXXXX

 

异常

一、异常、错误概念:

异常:(Exception)程序本身可以克服和恢复的问题,遇到异常建议捕获处理异常,是程序基础正常执行,如:空指针异常、算数异常、下标越界异常等等,异常并不是代码语法错误。

错误:(Error)不能处理的问题,程序本身无法克服和恢复的严重问题,遇到错误,建议终止程序执行,如:栈溢出错误等等。

异常处理的好处:

提高代码容错性健壮性

将业务功能代码和异常处理代码分离

二、异常体系:

  • 父类:Throwable(lang)
  • 子类:ErrorException
  • Exception分为 运行时异常检查异常
  • 运行时异常 : RunTimeException该类的所有子类
  • 检查异常 : 运行时异常之外,其他的异常。

三、十个异常:

  • classCastException--------------------------------------类型转换异常
  • nullPointerException------------------------------------空指针异常
  • dateTimeException--------------------------------------日期时间异常
  • IndexOutOfBoundsException------------------------数组下标越界异常
  • ArithmeticException-------------------------------------算数错误异常
  • InputMismatchException------------------------------输入不匹配异常
  • SQLException-----------------------------------------------数据库异常
  • IOException-------------------------------------------------IO流异常
  • FileNotFoundException---------------------------------文件未找到异常
  • FileAlreadyExistsException-----------------------------可选特定的异常

四、异常处理机制:

try{
    业务功能代码
}catch(异常类名 变量名){
    异常处理代码
}catch(异常类名 变量名){
    异常处理代码
}
.......
finally{
    异常处理代码
}

 

  • 把可能出现异常的代码放在try中;
  • catch和finally可以只有其中一个;
  • finally中的代码一定会执行。

五、异常处理逻辑

  • 业务功能代码没有抛出异常,执行finally中的代码,程序接着向下正常执行;
  • 业务功能代码抛出异常,try块中抛出异常语句后面的语句不会执行,将抛出的异常类对象依次和catch后面的异常类进行对比,如异常类对象 instanceOf 异常类名 为真,则被该catch捕获,执行该catch后的异常处理代码,再执行finally中的代码,程序接着向下正常执行。
  • 业务功能代码抛出异常,没有被后面的catch捕获,执行finally中的代码,系统将该异常类对象向上抛出。抛给了调用该方法的方法。

六、注意事项:

  • Exception一定要放在最后一个catch中判断;
  • 在try或catch中执行return语句时,在将栈中的地址弹出并返回前会执行finally 中的代码。
public class Exception01 {
    static void f() {
        try {
            Scanner scanner = new Scanner(System.in);
            int a, b;
            System.out.println("请输入两个整数:");
            a = scanner.nextInt();
            b = scanner.nextInt();
            System.out.println(a / b);
            System.out.println("===");
        } catch (ArithmeticException e) {
            System.out.println("捕获算数异常");
        } catch (Exception e) {
            System.out.println("捕获异常");
        } finally {
            System.out.println("一定执行");
        }
        System.out.println("f执行完毕");
    }

    static int g() {
        int a = 1;
        try {
            a = 2 / 0;
            return a;
            //1、将a的表达式的值放在了可以被main方法和g方法都能访问的空间中;
            //2、执行finally语句
            //3、从栈中弹出返回的地址,跳转到该地址执行
        } catch (Exception e) {
            return a;
        } finally {
            a = 3;
            return a;
        }
}

    public static void main(String[] args) {
        try {
            f();
        } catch (InputMismatchException e) {
            System.out.println("捕获输入格式不匹配异常");
        }
        System.out.println("++++++");
        int t = g();
        System.out.println(t);
    }
}

 


七、异常类中常用方法:
  • Exception(String massage):
  • String getMessage():
  • void printStackTrace()://打印栈轨迹
public class Exception02 {
    static void f1(){
        System.out.println("进入f1");
        f2();
        System.out.println("退出f1");
    }
    static void f2(){
        System.out.println("进入f2");
        f3();
        System.out.println("退出f2");
    }
    static void f3(){
        System.out.println("进入f3");
        f4();
        System.out.println("退出f3");
    }
    static void f4(){
        System.out.println("进入f4");
        System.out.println(3 / 0);
        System.out.println("退出f4");
    }
    public static void main(String[] args) {
        Exception exception = new Exception("你好");
        String message = exception.getMessage();
        System.out.println(message);
        try{
            f1();
        }catch (Exception e){
            System.out.println("*****************");
            exception.printStackTrace();
            //创建了线程,在新的线程中打印栈轨迹
        }
        System.out.println("------------------");

    }
}

 


八、自定义异常:
  • 继承Exception,通常是 RuntimeException
  • 可以在自定义异常的构造方法中来调用super(message)来设置和提高getMessage获取消息
九、throw和throws的区别:

throw:

  • throw语句用在方法体内,表示抛出异常,由方法体内的语句处理;
  • throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出某种异常。

throws:

  • throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常处理;
  • throws主要是声明这个方法会抛出某种异常,让他的使用者要知道需要捕获的异常的类型;
  • throws表示出现异常的一种可能型,并不一定会发生这种异常

posted on 2022-08-16 22:18  LXXXXxZz  阅读(34)  评论(0编辑  收藏  举报

导航