第6章 异常处理 Flashcards
(3 cards)
异常处理概述
异常是在程序编译或运行中所发生的可预料或不可预料的异常事件,它会引起程序的中断,影响程序正常运行。
在Java语言中,异常机制是:一旦出现异常,可以由运行的方法或虚拟机生成一个异常对象,它饮食异常事件的类型以及发生异常时程序的状态等信息。异常对象从产生和被传递提交始Java运行系统的过程称为抛出(throw)异常。在Java运行时,如获得一个异常对象,它会自动寻找处理该异常的代码,它从生成异常对象的代码构件开始,沿着方法调用栈,按导回溯寻找,直至找到处理该类异常方法为止,再由Java运行系统将该异常对象交给该方法去处理,这一个过程称为捕获(catch)异常。Java语言能按机制来接收并处理异常,是要求所指异常对象必须是已定义好的异常类的实例。Java语言中的类库,已定义有许多异常类可利用。异常对象用new来创建,一旦创建合,就停止当前执行路径,再从当前环境中释放异常对象的地址,此时异常机制就接管一切,把程序转向异常处理器,去解决程序是否能继续进行还是报错。
Java语言的类库中提供一个别Throwable类,所有的异常对象都必须是它的实例。Throwable类中的方法对抛出异常进行描述。异常在Java程序中是有层次的。
Throwable类是直接Object类继承来的,是所有异常类的根(父类),它的定义如下:
public class Throwable exception Object implement Serializable它有public Throwable()和public Throwable(String message)两个构造函数,其中的字符串参数可利用getMessage()方法去获得参数内容。
Throwable类分为Error和Exceptiong两子类,Error类包括动态连接失败、硬件设备和虚拟机出错等,通常的Java应用程序不会捕获和抛出这类异常,而是捕获和抛出Exception这类异常,它包括运行时出现的异常,并对这类异常作出处理。
Throwable类有 public Throwable()和public Throwable(String message)两种构造函数,包含getMessage()、toString()、printStackTrace()、fillStackTrace()方法,其中getMessage()方法用来返回带参数构造函数创建异常时的参数内容,对无参数构造函数而言,用它返回的是空值;toString()用来返回异常的类名和getMessage()能得到的内容,两面三刀者用冒号分隔,如getMssage()得的是空值,它只返回异常类名;printStrace()方法用来在标准输出设备上输出堆栈使用的跟踪;fillStrackTrace()方法用在重新抛出异常时对堆栈的跟踪。
异常类型
按异常处理不同可分为运行异常、捕获异常、声明异常和抛出异常几种。 1、捕获异常 当异常已被定义时,必须通过try-catch-finally语句处理它,其语法如下: try{ ┋ //可能出现异常的程序段 }catch(ExceptionName1 e){ ┋ //异常处理程序段1} catch(ExceptionName2 e){ ┋ //异常处理程序段2} ┋ }finally{ ┋ //最后异常处理程序段 } 捕获异常的第1步是try{…}语句选定异常的范围,由招待它的程序代码段决定可能生成异常对象并抛出;第2步由它的catch子句(一个或多个)去处理它所抛出的异常事件,catch子句要求一个形式参数,指明所捕获的异常类型,该类型必须是Throwable的子类,运行时Java解释器通过该参数值将被抛出的异常对象传递给相应的catch程序段,由该程序段处理,它可用Throwable的getMessage()方法获得异常事件信息,还可利用Throwable的printStackTrace()方法跟踪异常事件发生后招待堆栈的内容;第3步是通过finally子句完成,释放资源,作为异常处理的统一出口。 2、声明异常 Java语言中,有时一个方法生成一个异常,但该方法并不能确定如何处理此异常,如找不到文件之类的展品常,必须将异常传递给调用方法,由调用它的方法来处理,这种时候方法用声明异常抛出,让展品常对象可从调用栈向后传递,直至有相应的方法捕获它为止。声明异常抛出用throws子句来完成声明,throws子句包含在方法的声明之中,语法如下: throws exceptionList //异常列表是用逗号分隔的多个异常 3、抛出异常 在捕获一个异常之前,必须先有异常抛出,才生成一个异常对象,这就用报出异常来实现。抛出异常的程序代码可以是Java应用程序,或者是JDK中的某个类,还可能性是JVN。抛出异常、生成异常对象都通过throw语句实现,如: IOException e=new IOException; throw e; 当然,能抛出的异常必须是Thtowable类或其子类的实例。利用throw语句不可以自定义异常类抛出。
处理异常
1、try和catch语句
在捕获异常时要用try-catch语句,该语句执行时,解释器把可能产生异常的代码段形成一个“警戒区”,该“警戒区”由try引导。“警戒区”后面是catch从句,一个“警戒区”后面可接多个catch从句。catch的程序段由catch引导。try“警戒区”代码包括一些简单语句或方法调用,在它遇到异常情况时,停止执行而转跳到相应处理异常的程序,这就由catch来控制。catch子句都带一个参数,该参数是某个异常的类及其变量名(该异常对象的指针),catch用该以数去与抛出异常对象的类进行匹配,匹配上后就去执行该catch后的程序段,即处理该异常;如匹配不上就跳到下个catch,直至找到为止。
注意:try内部不同的方法调用有可能产生相同的异常,但中需一个catch从句。
与catch匹配原则:
①不要用一个子类去捕获父类的异常,尽可能用一个父类去捕获其所有子类的异常。
②catch从句的顺序排列要注意,应该将最特殊的排在最前面,依次逐步一般化。
2、finally语句
捕获异常的统一出口通过finally从句,因此对catch而言,无论由哪个捕获异常,最后一定去执行finally从句,保证控制流在转到其他路径以前,程序的状态能被统一管理。另外,在系统执行时,遇到异常,就自动跳转,出现异常语句后面的程序就不被执行。实际上,经常还需要做一些与系统相关的工作,如释放相关的工作,如释放资源、关闭文件、关闭数据库等,这就可利用finally从句来完成。
3、异常处理的原则
Java语言的异常处理机制是要掌握几条原则:
①把应用程序的异常事件分类,利用异常的层次来动态控制。在捕获或声明异常时,应注意选择适当的异常类选择适当的地方处理,是在方法内处理还是用throws子句传递给调用栈的上层。
②把异常处理的代码与正常代码分开,简化程序并增加可读性。如对异常不知道在何时何地了生,也不知该如何处理,可交给虚拟机去处理。
③利用finally语句作为异常处理的统一接口。
④能用简单测试不要用异常控制,对异常不要过分细化,也不要压制,不要介意对异常的传递。
⑤自定义的异常类,都是Throwable及其子集,除了在运行时产生或不易预测外,都定义为非运行时的异常。