异常处理
前言
本文是java异常处理的笔记
内容
1、异常:
2、java异常处理机制:
在一个方法的运行过程中,如果发生了异常, 则这个方法(或者是Java虚拟机)生成一个代表该异常的对象(它包含了异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。
运行时系统寻找相应的代码来处理这一异常,系统在方法的调用栈中查找,从产生异常的方法开始进行回朔,沿着被调用的顺序往前寻找,直到找到包含相应异常处理的方法为止。其过程如下图所示。这一过程称为捕获(catch)一个异常。 如该异常未进行成功捕获,则程序将终止运行。
3、异常的捕获处理
1、try语句 捕获异常的第一步就是用try
{…}语句指定一段代码,该段代码就是一次捕获并处理异常的范围。在执行过程中,该段代码可能会产生并抛出一个或多个异常,因此,它后面的catch语句进行捕获时也要做相应的处理。
2、catch语句
每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的异常并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获的异常类型,运行时系统通过参数值把被抛出的异常对象传递给catch语句。
当用多个catch语句时,需要记住:异常子类必须在它们任何父类之前使用
3、finally语句 无论try所指定的程序块中抛出或不抛出异常,也无论catch语句的异常类型是否与所抛出的异常类型一致,finally所指定的代码都要被执行,它提供了统一的出口。 通常在finally语句中可以进行资源的清除工作,如关闭打开的文件等。finally在文件处理时非常有用,例如: try { 对文件进行处理的程序; }catch(IOException e) { //对文件异常进行处理; }finally { //不论是否发生异常,都关闭文件; } 注意:在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译
4、例子
程序修改为提供捕获“被零除”的异常处理。只需要把所要监控的代码放进一个try块就可以了。紧跟着try块的,是包括一个说明捕获的错误类型的catch子句。
5、异常分类
Java的异常是一个对象,所有的异常都直接或间接地继承Throwable类。Throwable类的继承层次结构如下:
Throwable类是所有异常的超类。它有两个子类Error和Exception。
Error类及其子类由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等。Java程序不应捕获这些异常。
Exception类及其子类(RuntimeException和
IOException)代表Java程序中可能发生的异常,并且应用程序可以捕获这些异常。
除了Java类库所定义的异常类之外,用户也可以通过继承已有的异常类(一般从Throwable类或Exception类继承)来定义自己的异常类,并在程序中使用(利用throw产生,catch捕捉)。
6、异常对象的生成
7、重新抛出异常对象 throws
重新抛出异常对象首先必须先生成异常。
如果在一个方法中生成了异常,但是该方法并不处理它自己产生的异常,而是沿着调用层次向上传递,由调用它的方法或方法栈来处理这些异常,这叫重新抛出异常
例子:
8、定义新的异常类型
例子
小结
Java通过面向对象的方法进行异常处理,把各种不同的异常事件进行分类,由于把异常事件当成对象来处理,利用类的层次性可以把多个具有相同父类的异常统一处理,也可以区分不同的异常分别处理,使用非常灵活。
应该根据具体的情况选择在何处处理异常。或者在方法内捕获并处理,或者用throws子句把它交给调用栈中上层的方法去处理。
对非运行时异常必须捕获或声明。对运行时异常,若不能预测它何时发生,程序可不作处理,而是交给Java运行时系统来处理。
异常可以是系统已经定义好的,也可以是用户自己定义的。异常可人为地抛出,用throw new 语句。
使用finally语句为异常处理提供统一的出口。