异常的继承体系:

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的运行:

System.exit(int)方法:直接和JVM打交道,退出程序。
电脑停电。
可以使用多个catch语句:

   try {

   } catch (A a) {

   } catch (B b) {

   }

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

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

   try {

   } catch (A | B | C ex) {

   }

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

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

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

Throwable当中的常用方法:

   getMessage():获取细节信息。

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

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

自定义的异常

定义一个类,继承一个已经存在的异常。
编写一个无参数的构造方法。
编写一个String参数的构造方法,并且调用super(String);
编译异常:Exception及其子类,但是除了RuntimeException及其子类

要么try-catch处理
要么throws甩锅

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

运行异常:RuntimeException及其子类

可以try-catch处理
也可以throws甩锅
还可以根本不理会,没有红线
一道题:

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也不会运行!

Last modification:July 29th, 2019 at 05:20 pm