七, 异常体系

1. 异常基础知识

1. 异常的定义

  1. Exception: 异常就是代表程序出现问题, 我们通常会用Exception以及它的子类来封装程序出现的问题, 包括

    • 运行时异常: RuntimeException及其子类, 编译阶段不会出现异常提醒, 运行时的异常: 如数组索引越界异常
    • 编译时异常: 除了RuntimeException及其子类, 都是编译时异常, 编译阶段就会出现异常的: 如日期解析异常
  2. 误区: 不是不让出现异常, 关键在于异常出现怎么处理

  3. java.lang.Throwable: 包含Error和Exception

  4. Error: 代表的系统级别错误(属于严重问题)
    系统一旦出现问题, sun公司会把这些错误封装成Error对象
    Error是给sun公司自己用的, 不是给程序员用的, 所以我们无需管

  5. 异常的作用:

    • 异常是用来查询bug的关键参考信息
    • 异常可以作为方法内部的一种特殊返回值, 以便通知调用者底层的执行情况

2. 异常的处理方式

2.1 JVM默认的处理方式

  1. 把异常的名称, 异常原因以及异常出现的位置等信息输出在了控制台
  2. 程序停止执行, 下面的代码不会再执行了

2.2 捕获异常(自己处理)

1. 格式

  1. 当代码出现异常时, 可以让代码继续往下执行
  2. 格式:
  try{
    可能出现异常的代码;
  }catch(异常类名 变量名){
    异常的处理代码
  }  
        int[] arr = {1, 2, 3, 4, 5};
        try{
            System.out.println(arr[10]); // 此处出现了异常, 程序会在这里创建一个异常对象
                                         // new ArrayIndexOutOfBoundsException();
                                        // 拿着这个对象到catch的小括号中对比, 看括号中的变量是否可以接收这个对象;
                                        // 如果能被接收, 就表示该异常被捕获, 执行catch里面的代码;
                                        // 当catch里面所有的代码执行完毕, 就会继续执行try catch之后的代码;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界了");
        }
        System.out.println("是否执行到此处");
  1. 如果try没有遇到问题, 会把try里面的代码全部执行完毕, 不会执行catch里面的代码

  2. 如果try中遇到多个问题, 要写多个catch进行接收, 多个异常如果存在父子关系, 一定要将父类写在下面

  3. 如果try中遇到的问题没有被捕获, 会使用虚拟机默认处理方式

  4. 如果try遇到了问题, try下面的代码不会执行了, 直接跳转到相应的catch语句中, 执行catch里面的语句体
    ab172c2469435136aac6278b23322ab
    6ac17c55189c57ec60cf334e1315c3a

2. 异常中的常见方法

  1. printStackTrace() 在底层是利用System.err.println进行输出: 把异常的信息仅仅是用红色字体输出在控制台
    image
        int[] arr = {1, 2, 3, 4, 5};

        try {
            System.out.println(arr[10]);
        } catch (ArrayIndexOutOfBoundsException e) {
//            System.out.println(e.getMessage());
//            System.out.println(e.toString());
            e.printStackTrace();
        }

        System.out.println("是否执行到此处");

2.3 抛出异常(交给调用者处理)

  1. 在方法中, 出现异常了, 方法就没有继续执行下去的意义了, 此时抛出异常, 让该方法结束运行并告诉调用者出现了问题
    image
        // 需求: 定义一个方法求数组的最大值
        int[] arr = new int[0];
        int max = 0;
        try {
            max = getMax(arr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(max);

    }
    public static int getMax(int[] arr) /*throws NullPointerException, ArrayIndexOutOfBoundsException*/{
        if(arr ==  null){
            // 手动创建一个异常对象, 并把这个异常交给方法的调用
            // 此时方法结束, 下面的代码不会执行
            throw new NullPointerException("数组不能为null");
        }
        if(arr.length == 0){
            throw new ArrayIndexOutOfBoundsException("数组不能为空");
        }
        System.out.println("look exexcuted");
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }

        return 1;
    }

3. 自定义异常

  1. 自定义异常意义就是为了让控制台的报错信息更加地见名知意
  2. 自定义异常包括: (1) 定义异常类 (2) 写定义关系 (3) 空参构造 (4) 带参构造
    image
posted @ 2025-08-10 15:44  awei040519  阅读(8)  评论(0)    收藏  举报