第五讲异常(JAVA网络编程技术)_第1页
第五讲异常(JAVA网络编程技术)_第2页
第五讲异常(JAVA网络编程技术)_第3页
第五讲异常(JAVA网络编程技术)_第4页
第五讲异常(JAVA网络编程技术)_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五讲异常什么是异常异常的处理使用预定义的异常处理的规则1什么是异常

异常(Exception)是程序执行过程中出现的非正常事件,即各种意外情况。比如说:①用户输入出错②所需文件找不到③运行时磁盘空间不够④内存不够⑤算术运算错(数的溢出,被零除…)⑥数组下标越界……2什么是异常当Java程序出现以上的错误时,就会在所处的方法中产生一个异常对象。这个异常对象包括错误的类型,错误出现时程序的运行状态以及对该错误的详细描述。3为什么需要异常作为面向对象的编程语言,Java程序在运行过程中遇到的各种异常情况也是通过对象表示的。在软件中通过一类特殊的对象——异常将这些特殊情况传递给使用该软件包的程序,由其决定如何处理。4异常类的结构ObjectThrowableErrorExceptionRuntimeExceptionIOException5Throwabal类包括两个子类:Error和Exception。Error类用于表示一些比较严重的错误,难以恢复,程序员一般不用处理这些错误。Exception类一般代表程序设计或实现方面的问题。Exception类包括两个子类:RuntimeException和IOException例8-4。异常类的结构6RuntimeException类所表示的异常,只要程序设计没有问题都不会产生,对这些异常一般不做处理,以便问题能自然暴露出来。IOException类代表输入输出操作产生的异常。这些异常一般是由用户环境而非程序本身问题造成的,JDK中一般强制调用者在使用时作处理。异常类的结构7异常处理机制抛出(throw)异常:

在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。两种处理异常的机制:

声明抛出异常:

如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛出(throws)异常。这是一种消极的异常处理机制。8异常处理机制两种处理异常的机制:

捕获异常:

当Java运行时系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。这是积极的异常处理机制。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。9

throws异常说明总是和方法说明出现在一起。这样,方法说明告诉编译器该方法可能会产生哪些异常,从而要求它的调用者必须考虑处理这些异常。带throws异常说明的方法说明形式如下:

…方法名(…)[throws异常类列表]{方法体}方法抛出的异常类是throws子句中指定的异常类或其子类。

throws抛出异常10

并不是所有可能发生的异常都要在方法的说明中指定,从Error类中派生出的异常和从RuntimeException类中派生的异常就不用在方法声明中指定。这两类异常属于不检查异常。不检查异常则是那些无法干预的异常。Java中的另一类异常是检查异常,检查异常是那些在程序中应该处理的异常,程序完全可以避免的异常(比如数组越界错误)。而throws异常说明必须指定有可能发生的检查异常。throws抛出异常11

在程序中使用throw语句(注意,这里是throw而不是throws)来抛出异常,该异常可以在该程序中进行捕获、处理,也可以在调用该方法者捕获、处理。

throw语句的形式为:

throw异常类的实例;throw抛出异常12如何创建和使用异常使用异常可从编写软件包者和使用软件包者两个角度来看:编写软件包者需要将其难以处理的情况定义为异常类,在软件包中碰到对应的情况时就创建相应的异常对象,并通过关键字throw关键字抛出。软件包的使用者在使用软件包时就可以根据一定的方法获得该异常对象,从而知道这是一个什么样的情况,并根据需要作处理了。13异常的捕获try{

可能产生异常的代码}catch(异常类型1变量){调用者对异常的处理}catch(异常类型2变量){调用者对异常的处理}例8-5。14多个catch的匹配catch语句的顺序:

捕获异常的顺序和catch语句的顺序有关,异常对象产生后,将按照次序一个一个匹配,一旦匹配成功,其余的catch语句将不再继续和其匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。15

finally语句可以说是为异常处理事件提供的一个清理机制,一般是用来关闭文件或释放其他的系统资源,作为try-catch-finally结构的一部分,可以没有finally语句,如果存在finally语句,不论try块中是否发生了异常是否执行过catch语句,都要执行finally语句。finally子句16带有finally子句的try-catch-finally语句的形式如下:

try

{…}//是正常执行的代码,可能产生异常

catch(异常类1e1)

{…}//异常类1的处理代码

catch(异常类2e2)

{…}

//异常类2的处理代码

……

catch(异常类nen)

{…}//异常类n的处理代码

finally

{…}

//…是执行清除工作的语句finally子句17

带有finally子句的try-catch-finally语句无论在try块中是否产生异常,也不管产生的异常是否会被捕获,finally中的语句最终都会被执行。具体的执行过程如下:

(1)try块中的语句没有产生异常。在这种情况下,Java首先执行try块中的所有的语句,然后执行finally子句中的代码,最后执行try…catch..finally块后面的语句;

finally子句18

(2)try块中的语句产生了异常,而且此异常在方法内被捕获。在这种情况下,Java首先执行try块中的语句,直到产生异常处,然后跳过此try块中剩下的语句,执行捕获此异常的catch子句的处理代码;然后执行finally子句中的代码;

finally子句19

(3)如果catch子句中没有重新抛出异常,那么Java将执行try…catch…finally块后面的语句。如果在catch子句又重新抛出了异常,那么Java将这个异常抛出给方法的调用者;(4)try块中产生了异常,而此异常在方法内没有被捕获。在这种情况下,Java将执行try块中的代码直到产生异常,然后跳过try块中的代码而转去执行finally子句中的代码,最后将异常抛出给方法的调用者。finally子句20finally中的内容总会执行到,甚至当try中执行到return语句也会先将finally执行完再返回执行return。finally总会执行,除了一种情况:程序执行到System.exit(),这时程序会立刻退出。例8-7。finally子句21方法相互调用及异常处理规则程序从main开始执行,若其中执行了方法go1(),而go1()又调用了方法go(),在方法go()的语句执行时有异常抛出,则该异常将根据调用关系一层一层向外抛出,直到某个方法将其捕获,若所有的方法都为捕获,则程序将非正常退出。程序流程图如下图所示。例8-8、8-9、8-10。22方法相互调用及异常处理规则23强制处理Java中可以在方法(函数)定义中加入throws关键字声明抛出异常来实现强制处理。实现强制处理的方法在使用时必须对其进行异常处理,否则编译出错。处理的办法有两种:1、try…catch语句处理2、在调用该方法的方法声明中继续声明抛出异常。例8-12、8-13、8-14、8-15。24用户定义的异常1、定义Exception子类,代表异常类型2、在适当的时候创建并抛出异常对象。3、调用者处理异常例8-1。25classMyDateException

extendsException

{

privateStringreason;

publicMyDateException(Stringr)

{

reason=r;

}

publicStringgetReason()

{

return(reason);

}}26classMyDate{

int

year,month,day;

voidsetDay(int

y,int

m,intd)throwsMyDateException

{

if(d>31)

{

thrownewMyDateException("daytoobig");

}

}}27classt{publicstaticvoidmain(String

args[]){

MyDatet=newMyDate();

try{

t.setDay(2001,1,100);

}

catch(MyDateException

ee)

{

System.out.println(ee.getReason());

}}}28覆盖与异常规定:子类中覆盖的方法抛出的异常不能比父类被覆盖的方法抛出更多的异常。解决办法:子类中覆盖方法抛出的异常和父类被覆盖的方法抛出的异常一样多,或在子类中不抛出异常。例:overriding.java29

由于异常使用起来非常方便,以至于在很多情况下可能会滥用异常。但是,使用异常处理会降低程序运行的速度,如果在程序中过多地使用异常处理,程序的执行速度会显著地降低。这里给出几点建议,来帮助掌握好使用异常处理的尺度。

正确地使用异常30(1)在可以使用简单的测试就能完成的检查中,不要使用异常来代替它。例如:

if(ins!=null)

//使用ins引用对象

{…

}(2)不要过细地使用异常。最好不要到处使用异常,更不要在循环体内使用异常处理,可以将它包裹在循环体外面.正确地使用异常31(3)不要捕获了一个异常而又不对它做任何的处理。如:

try{……//正常执行的代码

}catch(Exceptione){}(4)将异常保留给方法的调用者并非不好的做法。对于有些异常,将其交给方法的调用者去处理是一种更好的处理办法。正确地使用异常32

异常处理把Java程序各种可能出现的错误都看作异常,集中起来统一处理。程序员只需要说明何处理可能的出现异常,如何处理即可。

throws抛出异常和方法说明联系在一起

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论