资源预览内容
第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
第9页 / 共20页
第10页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第11章 异常处理,在开发项目的过程中,核心业务代码只占了20%30%左右的时间,而用于开发容错代码的时间却高达70%80%,这大大降低了开发效率。Java中提供的异常处理机制,可以很好地在一定程度上解决这个问题。 通过使用异常处理机制,可以使容错代码的开发变得轻松愉快。本章将对Java中的异常处理机制进行详细的介绍,主要包括异常处理的基本知识、异常的层次结构、异常的匹配、定义自己的异常、再次抛出异常、断言等内容。,11.1 异常处理的基本知识,本节主要介绍捕获与处理异常的基本语法,主要包括try/catch/finally语句的基本使用、异常的传播过程及实际开发中需要注意的问题等内容。,11.1.1 try和catch捕获异常,本小节将介绍如捕获异常以及如何对异常进行处理,主要包括如下两个方面的内容。 捕获并处理异常的语法 try-catch语句的执行流程 1捕获并处理异常的语法 2try-catch语句的执行流程,11.1.2 异常的传播过程,上一小节介绍了有catch语句块捕获异常情况下异常处理的过程,如果没有catch语句块捕获异常,异常将沿着方法的调用栈一直向上传播。如果传播的过程中一直没有catch语句块捕获,则最终传播到main方法,最后从main方法抛出,由Java运行时环境(JRE)来处理。,11.1.3 finally语句块的使用,某些特殊情况下,经常需要用到finally语句块,本小节将详细介绍finally语句块的使用,主要包括如下两点内容。 finally语句块的基本使用规则 finally语句块的作用 1finally语句块的基本使用规则 2finally语句块的作用,11.2 异常的层次结构,当异常发生时,Java会将该异常包装成一个异常类的对象,并将其引用作为参数传递给相应的catch语句,这样在catch语句中就可以对这个异常对象进行操作。本节将系统的介绍异常类的层次结构,主要内容包括捕获异常与未捕获异常两个方面。,11.2.1 捕获异常,Java类库中有一个java.lang.Throwable类,其继承自java.lang.Object类,是所有异常类的超类。,11.2.2 未捕获异常,在图11.12显示的继承树上,除了捕获异常以外的部分都是未捕获异常,即Error类及其子类以及RuntimeExcepiton类及其子类。 继承自Error的类一般代表由硬件运行失败导致的严重错误,而其从严格意义上将,不属于异常,因为其不属于Exception类的子类。一般来说,程序不能从Error中恢复,例如内存耗尽就是一个属于Error的情况,这种情况是无法恢复的。 而RuntimeException类的子类通常是指一些程序运行时错误引起的异常,所以也可以不对其进行处理。,11.3 再次抛出异常,实际开发中,不可能所有的异常在其产生的位置都能立即进行处理,有时需要上报,由上一级程序进行处理。这里所谓的上报就是异常的再次抛出,本节主要对这方面的内容进行介绍,主要包括异常的再抛出的含义、显性再抛出、隐性再抛出等内容。,11.3.1 什么是异常的再抛出,异常的再抛出与人类社会解决问题的模型是很相似的。打个比方,在某厂的某部门某车间内发生了一些状况,车间内部就去解决,但是如果状况很大,车间内部解决不了,车间就会将此事上报,推给部门进行处理,若部门解决不了继续向上推,直至某个地方能将此事解决。,11.3.2 显性再抛出,一旦方法有可能抛出捕获异常,则在方法声明时需要特别指出,否则编译报错。而通过编写代码将catch语句捕获的异常再次抛出,就称为显性再抛出。本小节将主要介绍以下两方面的内容。 显性再抛出的语法规则 声明异常抛出需要注意的问题 1显性再抛出的语法规则 2声明异常抛出需要注意的问题,11.3.3 隐性再抛出,通过前面介绍的显性再抛出。如果只是想把收到的异常再抛出,不必使用显性再抛出,使用隐性再抛出即可。隐性再抛出语法比显性再抛出简单,效果是相同的,隐性与显性再抛出在语法上有如下几点异同。 若抛出的是捕获异常,隐性与显性再抛出都必须在方法声明中明确声明。 显性再抛出是在方法体中使用throw语句将产生的异常抛出,隐性再抛出是在方法体中没有任何抛出异常的语句,若产生异常将自动抛出。,11.4 定义自己的异常,从前面的例子中可以看出,用throw语句抛出的异常不一定是捕获的,也可以是自己创建的。Java中每个异常类都代表一种特定的情况,有时系统中已有的异常类型不能满足使用的需要。这时,就需要抛出自定义的异常对象,本节将介绍如何创建以及使用自己定义的异常类,以及显性再抛出在实际开发中的意义与作用。,11.4.1 创建自己的异常类,本小节主要介绍如何创建自己的异常类,内容有如下两个方面。 自定义异常类的途径 Exception类的几个常用方法 1自定义异常类的途径 2Exception类的几个常用方法,11.4.2 使用自定义的异常类,前面举的例子大部分都是调用类库中可能抛出异常的方法,那其实是在享受别人的劳动成果。开发人员只要把有可能产生异常的方法调用放在try语句块中,发生异常后再处理即可。而判断何时产生异常,在什么情况下产生哪种异常的代码并不需要开发,而那些实现规则的代码要复杂得多。 自定义异常类的一大功能就是当开发人员需要自己开发实现某些规则、功能的代码时,一旦情况不满足要求,向外抛出自己的异常。,11.5 异常的匹配,从前面的例子中可以看出,try-catch语句中可以有任意多个catch语句块,但是这些catch语句块并不是随意放置的。为了异常匹配的需要,其顺序有严格的规定,本节将为读者介绍这方面的内容,主要包括同时捕获多种异常、多个catch语句的先后顺序两个方面。,11.5.1 同时捕获多种异常,前面章节中已经介绍过,在try-catch语句捕获并处理异常时,可以为catch语句块指定处理的异常类型,实际上在单个catch语句中可以处理多种类型的异常,规则如下。 指定处理的异常类型若没有任何子类,则只能捕获指定的异常类型。 指定处理的异常类型若有子类,则指定类型及其子类的异常都可以捕获。,11.5.2 多个catch语句的先后顺序,前面的小节已经介绍过,一个catch语句块可以捕获多种类型的异常。若try语句后跟多个catch语句,并且各自指定的异常类型中,相互之间有派生关系,这时catch语句的先后顺序就必须满足一定的规则,否则有可能编译失败,规则如下。 若多个catch语句块中所指定的异常类型相互有派生关系,那么必须将子类型的异常写在上面,父类型的异常写在下面。 若为级别相同或者没有任何派生关系的异常类型,其catch语句放置的先后顺序无所谓。,11.5.2 多个catch语句的先后顺序,11.6 小结,本章详细介绍了Java中的异常处理机制,主要包括异常使用的语法、异常的层次结构、如何编写自己的异常类以及异常的匹配问题。在本章的学习中,读者应该注意不但要掌握语法规则,对编程思想的领悟更为重要。,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号