MOOC 浙江大学 面向对象程序设计-Java笔记(7)

------------翁恺老师授课
第七次课程 异常

异常处理:考虑可能发生的异常事件并做出相应处理,无论如何处理,再也无法回到发生异常的程序处了。

异常

异常类

每一个异常是一个对象,异常对象中包含发生异常的信息。异常发生并不意味着程序要终止,需要找到一个合适的地方处理这些异常。若异常在深层调用中已被处理,不会返回退出,可继续执行异常处理结束处之后的语句。

class 异常类{
	...
	方法1:getMessage //第多少行抛出的
	方法2:toString //异常类具体信息
	方法3:printStackTrace   //调用栈
	...
}
class Throwable{}
class Exception extends Throwable{}
class 自定义 extends Exception{}

Exception类非常常见

  • RuntimeException类:不处理,虚拟机捕获此类异常抛出的对象后停止程序的运行。
  • 非RuntimeException类:程序必须处理。

异常处理

  • 一个方法的运行过程发生了异常,则该方法生成代表该异常的一个对象,并将它交给运行时的系统,运行时系统会寻找相应的代码(见第2幅图)来处理发生的异常。
  • 捕获相应异常后,发现无法处理可再度抛出。
    图1
    图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. 异常申明遇到继承关系

  • 当子类覆盖一个父类中的函数时,子类不能申明抛出比父类的版本更多的异常。(基于多态特性,且父类定义的变量在接受子类的对象时,处理的异常类型是由父类决定(编写程序时),若有父类异常以外的异常无法被处理)
  • 在子类的构造中,必须申明父类可能抛出的全部异常。(基于父类构造器先于子类构造器被调用)
原文地址:https://www.cnblogs.com/yuecheng/p/12728097.html