




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
信息类专业课程,西北农林科技大学,第八章异常处理,导读,主要内容异常的含义及分类异常处理两种抛出异常的方式自定义异常常见异常难点自定义异常,1异常的含义所谓异常就是程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等2异常处理的必要性传统错误处理的不足之处,主要表现为:(1)程序复杂;(2)可靠性差;(3)返回信息有限;(4)返回代码标准化困难。Java语言采用错误代码和异常处理相结合的方式可以把错误代码与常规代码分开,也可以在catch中传播错误信息,还可以对错误类型分组。,一、异常的含义及分类,3异常的分类在java语言中,异常是一个对象,它继承于Throwable类,所有的Throwable类的子孙类所产生的对象都是例外(异常)。从Throwable直接派生出的异常类有Exception和Error,如图6-1所示。,一、异常的含义及分类,图1Java异常层次图,Throwable,一、异常的含义及分类,Exception是代表了真正实际意义上的异常对象的根基类。Exception和从它派生而来的所有异常都是应用程序能够捕获到的,并且可以进行异常错误恢复处理的异常类型。Error则表示出现了一个非常严重的异常错误,并且这个错误可能是应用程序所不能恢复的,例如LinkageError,或ThreadDeath等。由Java虚拟机生成并抛出,Java程序不做处理。java.long.Error和java.lang.RuntimeException的子类免于编译时的检查。RuntimeException异常由系统检测,用户的Java程序可不做处理,系统将它们交给缺省的异常处理程序。,一、异常的含义及分类,二、异常处理,2.1.异常处理的基本结构2.2.多个catch块2.3.finally语句,2.1异常处理的基本结构,1异常处理的定义异常处理是用户程序以预定的方式响应运行错误和异常的能力。它的基本方式是:当一个方法引发一个异常后,可将异常抛出,由该方法的直接或者间接调用者处理异常。2异常处理语句异常处理语句有try、catch、finally、throw和throws。在以下部分将逐一介绍这些语句的作用。,3异常处理的基本结构trycatch结构是异常处理的基本结构。这种结构中可能引发异常的语句封入在try块中,而处理异常的相应语句封入在catch块中。结构的格式如下:,2.1异常处理的基本结构,try程序执行体catch(异常类型1异常对象1)异常处理程序体1catch(异常类型2异常对象2)异常处理程序体2catch(异常类型n异常对象n)异常处理程序体nfinally异常处理结束前的执行程序体/不论发生什么异常(或者不发生任何异常),都要执行的部分;,2.1异常处理的基本结构,说明:(1)try语句指明可能产生异常的代码段;(2)catch语句在try语句之后,用于捕捉异常,一个try语句可以有多个catch语句与之匹配。当有多个catch语句时,系统依照先后顺序逐个检查。用catch语句捕捉异常时,若找不到相匹配的catch语句,将执行缺省的异常处理。(3)将catch程序块的参数不能设置成多个,一个catch只有一个参数.(4)若两个catch程序块(均和某个try程序块有关)都用于捕捉同一类型异常,那么将产生语法错误。(5)若某一类型异常,可能有几个异常处理程序与他相匹配,那么执行first相匹配的异常处理程序(6)java中可以使用嵌套的trycatch结构。在使用嵌套的try块时,将先执行内部try块,如果没有遇到匹配的catch块则将检查外部try块的catch块。,2.1异常处理的基本结构,throw语句用于指出当前现有异常,当程序执行到throw语句时,流程就转到相匹配的异常处理语句,所在的方法也不再返回值。throw语句可以将异常对象提交给调用者,以进行再次处理。throws语句指明方法中可能要产生的异常类型,由调用者进行异常处理。,2.1异常处理的基本结构,2.2多个catch块,单个try块能有许多catch块,当try块有可以引起不同类型异常的语句时,多个catch块是必须的。,【实例2】publicclassTryCatchpublicstaticvoidmain(Stringargs)inta=0,0;intnum=1,result=0;tryresult=num/0;System.out.println(num/a2);catch(ArithmeticExceptione)System.out.println(Errore);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(Errore);catch(Exceptione)System.out.println(Someothererror:);,2.2多个catch块,2.3finally语句,finally语句可以和try语句一起使用,无论是否出现异常,finally语句指明的代码一定被执行。一个异常处理程序只有一个finally块,但并不强制必须要有finally块。有时,必需处理某些语句(如文件关闭操作),不管异常是否发生,都必须执行。此时,虽然能够在try和catch块放置代码以结束文件,但是为了避免重写代码,可以把代码放在finally块。有时候我们希望某些语句在发生异常时也能执行,以释放外部资源或者关闭一个文件,这时可以用finally语句来实现。,【实例3】.*;importjava.io.*;classwithoutFinallyExamplepublicvoidfoo()throwsIOException/在空闲的端口上创建一个套接字ServerSocketss=newServerSocket(0);trySocketsocket=ss.accept();/此处的其他代码.catch(IOExceptione)ss.close();/label1throwe;/.ss.close();/label2,2.3finally语句,【实例3】问题上述代码没有finally块,程序中创建了一个套接字,并调用accept方法。在退出该方法之前,必须关闭此套接字,以避免资源漏洞。为此,在/label2处调用close来关闭此套接字,此语句为该方法的最后一条语句。正常情况下,/label2处的close会执行,但是,如果try块中发生一个异常会时,/label2处的close语句是不会执行的,即在这种情况下,套接字没有关闭,可能产生资源漏洞。因此,程序中必须捕获这个异常,并在重新发出这个异常之前在/label1处插入对close的另一个调用。这样就可以确保在退出该方法之前关闭套接字。但上述编写代码方式既麻烦又易于出错,但在没有finally的情况下这是必不可少的。以下借助finally块来解决这个问题。,2.3finally语句,【实例4】.*;importjava.io.*;classWithFinallypublicvoidfoo2()throwsIOException/在空闲的端口上创建一个套接字ServerSocketss=newServerSocket(0);trySocketsocket=ss.accept();/此处的其他代码.finallyss.close();,2.3finally语句,三、两种抛出异常的方式,3.1throw直接抛出3.2throws间接抛出异常(声明异常),3.1throw直接抛出,直接抛出异常是在方法中用关键字throw引发明确的异常。当throw被执行时,其后语句将不再被执行,执行流程将直接寻找catch语句并进行匹配throwe。显然,这种异常不是出错产生,而是人为地抛出。throw抛出异常的格式为:throwThrowableObject;例如:thrownewArithmeticException();,【实例5】classJavaThrow1publicstaticvoidmain(Stringargs)System.out.print(“Now”);trySystem.out.print(“is”);thrownewNullPointerException();/直接抛出一个异常;/System.out.print(“Thiswillnotexecute!”);/此句不被执行catch(NullPointerExceptionm)System.out.print(“the”);System.out.print(“time.n”);,3.1throw直接抛出,运行结果为:Nowisthetime.说明:在本实例中,“thrownewNullPointerException();”用于人为抛出异常NullPointerException,catch(NullPointerExceptionm)块对这类异常进行处理。注意:语句System.out.print(“Thiswillnotexecute!”);必须注释起来,否则编译时会出现如下错误。,3.1throw直接抛出,3.2throws间接抛出异常,说明:如果一个方法可能导致一个异常但不处理它,此时要求在方法声明中包含throws子句通知潜在调用者,在发生异常时沿着调用层次向上传递,由调用它的方法来处理这些异常。这类异常成为声明异常。基本格式为:类型方法名(参量表)throws异常列表代码,【实例10】classThrowsExceptionExample1privatestaticvoidp()throwsArithmeticException/间接抛出异常,自己并未处理,让方法的直接调用者来处理inti;i=4/0;/此句可能引发异常,可是自己并未处理publicstaticvoidmain(Stringargs)tryp();/方法的直接调用者俘获处理异常catch(ArithmeticExceptione)System.out.println(“Error:Divideriszero!n”);,3.2throws间接抛出异常,【实例6-10】运行结果为:Error:Divideriszero!说明:在本实例中,语句i=4/0;将产生异常,产生异常后方法p()并不作处理,而是由调用p()的方法main做处理。,3.2throws间接抛出异常,6.4自定义异常,通过继承Exception类或它的子类,实现自定义异常类。对于自定义异常,必须采用throw语句抛出异常,这种类型的异常不会自行产生。可以通过扩展Exception类来创建异常类。用户定义的异常同样要用trycatch捕获,但必须由用户抛出thrownewMyException。,6.4自定义异常,【实例11】/myException.javaclassmyExceptionextendsExceptionclassUserTrialintnum1,num2;publicUserTrial(inta,intb)num1=a;num2=b;voidshow()throwsmyExceptionif(num10)thrownewmyException();System.out.println(Value1=+num1);System.out.println(Value2=+num2);,【实例11】classmyExceptionThrowpublicstaticvoidmain(Stringargs)UserTrialtrial=newUserTrial(-1,1);trytrial.show();catch(myExceptione)System.out.println(IllegalValues:Caughtinmain);,【实例11】代码说明:(1)在上述给出的代码里,称myException类从Exception类扩展而来。(2)UserTrial类有一个能引发称为myException的自定义异常的方法。(3)在myExceptionThrow类里的main()方法创建UserTrial类的对象并传送错误值给构造方法。(4)main()方法的try块调用show()方法。(5)show()方法引发异常,由异常处理程序在main()方法里捕获。(6)显示在catch块里的消息,IllegalValues:Caughtinmain(非法的值:在main中俘获),被显示在屏幕上。,6.4自定义异常,6.5常见异常,RuntimeExceptionJava.lang包中多数异常的基类ArithmeticException算术错误,如除以0IllegalArgumentException方法收到非法参数ArrayIndexOutOfBoundsException数组下标出界NullPointerException试图访问null对象引用Sec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔护理临床知识试题库及答案2025年版
- 临床超声岗位招聘考试题及答案2025年版
- 2025年文化旅游演艺剧目与旅游商品开发协同运营可行性研究报告
- 2025年文化旅游节庆活动旅游品牌建设策划运营创新可行性报告
- 2025年文化创意产业投资基金设立项目:技术创新驱动下的可行性研究
- 2025年文化创意产品线下体验店文化消费升级趋势分析报告
- 2025年陶瓷增韧3D打印技术发展动态与市场预测
- 2025年合同中的附加条款是否具有法律效力
- 2025年星球轨道答题题库及答案
- 生产打印机磁辊、复印机磁辊、打印机-复印机磁芯新建项目环评报告表
- 别墅装修施工工艺
- 《手术室护理实践指南》专项测试题附答案
- 医务科依法执业自查表
- 部编版小学音乐五年级上册教案
- 综合实践活动(2年级下册)第3课时 自动浇水器的设计与制作-课件
- 2023年江苏省盐城公证处招聘公证人员5人笔试参考题库(共500题)答案详解版
- 保密室及保密要害部位搬迁发案
- 恐龙灭绝介绍课件
- 核赔经典疑难案例解析
- 尿道损伤的分类与治疗
- 眼科常见疾病诊疗指南
评论
0/150
提交评论