异常

异常的继承体系:

Object

       |–   Throwable

              |– Error                             错误

              |– Exception                      编译异常,受检异常

                     |– RuntimeException  运行异常,非受检异常



throw关键字:

       代表主动抛出一个异常,搞事情。

       throw new 异常类(参数);

       异常类 异常对象名 = new 异常类(参数); // 首先创建一个异常对象

       throw 异常对象名; // 然后再抛出

throws关键字:

       代表本方法当中出现了异常,我不管。甩锅。

       修饰符 返回值类型 方法名(参数类型 参数名称) throws 异常A, 异常B {

              方法体

       }

异常处理try-catch语句:

       try {

              // 被检测的代码

       } catch (异常类 异常对象名) {

              // 处理异常的代码

       }

异常处理try-catch-finally语句:

       try {

              // 被检测的代码

       } catch (异常类 异常对象名) {

              // 处理异常的代码

       } finally {

              // 一定会被执行的语句

       }

       只有两个人可以阻止finally的运行:

  1. System.exit(int)方法:直接和JVM打交道,退出程序。
  2. 电脑停电。

可以使用多个catch语句:

       try {

       } catch (A a) {

       } catch (B b) {

       }

       要求:如果互相之间存在继承关系,必须保证子类异常在前面,父类异常在后面。

可以在一个catch当中捕获多种异常:

       try {

       } catch (A | B | C ex) {

       }

       要求:用竖线分隔的多种异常之间,不能存在继承关系。如果有继承,应该只写父类异常。

方法覆盖重写的时候,必须保证:

       子类方法的throws异常范围,【小于等于】父类的范围。

Throwable当中的常用方法:

       getMessage():获取细节信息。

       toString():异常名称+细节信息。

       printStackTrace():打印异常栈信息(异常发生的位置信息)。

自定义的异常

  1. 定义一个类,继承一个已经存在的异常。
  2. 编写一个无参数的构造方法。
  3. 编写一个String参数的构造方法,并且调用super(String);

编译异常:Exception及其子类,但是除了RuntimeException及其子类

  1. 要么try-catch处理
  2. 要么throws甩锅

       写上有红线,不能不理会。

运行异常:RuntimeException及其子类

  1. 可以try-catch处理
  2. 也可以throws甩锅
  3. 还可以根本不理会,没有红线

一道题:

public static void main(String[] args) {
    try {
        int[] arr = new int[10];
        System.out.println(arr[10]);
        arr = null;
        System.out.println(arr[0]);

    } catch (ArrayIndexOutOfBoundsException e2) {
        System.out.println("数组角标越界");
    } catch (NullPointerException e) {
        System.out.println("空指针异常");
    }
    System.out.println("22222");
}

输出的结果是数组角标越界和22222

为什么?

在try语句里面,遇到异常后面的语句就不执行了 但是try—catch后面的22222还会执行

如果是throws抛出了异常,那么程序直接崩掉,后面的22222也不会运行!

发表评论