------------翁恺老师授课
第七次课程 异常
异常处理:考虑可能发生的异常事件并做出相应处理,无论如何处理,再也无法回到发生异常的程序处了。
异常
异常类
每一个异常是一个对象,异常对象中包含发生异常的信息。异常发生并不意味着程序要终止,需要找到一个合适的地方处理这些异常。若异常在深层调用中已被处理,不会返回退出,可继续执行异常处理结束处之后的语句。
class 异常类{
...
方法1:getMessage //第多少行抛出的
方法2:toString //异常类具体信息
方法3:printStackTrace //调用栈
...
}
class Throwable{}
class Exception extends Throwable{}
class 自定义 extends Exception{}
Exception类非常常见
- RuntimeException类:不处理,虚拟机捕获此类异常抛出的对象后停止程序的运行。
- 非RuntimeException类:程序必须处理。
异常处理
- 一个方法的运行过程发生了异常,则该方法生成代表该异常的一个对象,并将它交给运行时的系统,运行时系统会寻找相应的代码(见第2幅图)来处理发生的异常。
- 捕获相应异常后,发现无法处理可再度抛出。
异常机制
1. 抛出异常
- 并不是任何事物都可以抛出,只能抛出继承了Throwable类的子类的对象或Exception类的对象。
- 若某一方法体中确定抛出了某种异常,有2种不同的处理方案
(1)在该方法体的申明处说明若方法产生异常,则是此异常类型(这说明在该方法体内是不会捕捉处理此类异常的,提醒调用该方法的上级中处理此类异常)。
public void test() throws 异常类型A{
....
....
throw new 异常类型A();//其构造函数可带参数
}
(2)在当前方法体内处理此类异常
public void test(){
...
...
try{
...
throw new 异常类型A();
...
}catch(异常类型A及其父类){
处理...
}
}
2. 异常匹配
-
抛出子类异常会被捕捉父类异常的catch捕捉到。
-
catch捕捉的异常类型离try由近到远分别是从子类到父类再到超类。
3. 异常申明遇到继承关系
- 当子类覆盖一个父类中的函数时,子类不能申明抛出比父类的版本更多的异常。(基于多态特性,且父类定义的变量在接受子类的对象时,处理的异常类型是由父类决定(编写程序时),若有父类异常以外的异常无法被处理)
- 在子类的构造中,必须申明父类可能抛出的全部异常。(基于父类构造器先于子类构造器被调用)