一、异常的继承体系
Throwable是所有异常类型的父类。
Throwable有两个子类,Error类和Exception类。
Error:严重的错误,无法处理。
Exception:可以进行处理的异常,分为两类。
- RuntimeException:运行时异常,可以不处理,编译不会报错。
- 直接继承Exception类的异常被称为编译时异常,这类异常一定要处理,否则编译无法通过。
二、处理异常的思想
- 对于运行时异常,可以使用条件判断语句来规避异常。
- 对于编译时异常,用try...catch语句处理。
三、try...catch语句处理异常
//一个try可以跟多个catch
try {
可能出现异常的代码;
}catch(异常类型 变量名) {
异常处理语句;
}catch(异常类型 变量名) {
异常处理语句;(有两个作用:1.提示用户 2.记录异常信息,供测试人员分析)
}
当try里的代码出现异常时,会立刻执行catch中的代码来处理异常,使程序能够正常往下运行。
四、throw/throws抛出异常
- throw在方法体中抛出异常。
- throws声明方法抛出的异常类型。
- 如果方法体里抛出的是运行时异常,方法声明上的throws可以不写。
- 抛出异常的目的是让调用者根据具体的情况,自行处理异常。
public static int fibonacci(int n) /*throws RuntimeException*/ {
if (n <= 0) throw new RuntimeException();
//使用throw关键字抛出异常,throw后面跟一个Throwable类型的实例对象
if (n == 1 || n == 2) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
五、自定义异常
当遇到的异常类型和Java内置的异常类都不匹配时,我们可以自定义一个异常类型。
自定义的异常类型要继承Throwable类,通常继承Exception或RuntimeException。
六、注意事项
- 子类在重写父类的方法时,不能抛出比父类更大的异常(不包括运行时异常,因为jvm自己会抛运行时异常)。
- 父类方法没有抛出异常,子类在重写这个方法时也不能抛出异常。