版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章异常处理1.异常捕捉与处理什么是异常异常:在程序运行过程中,由于硬件设备出错、软件设计不完善等原因常常导致出现各种问题,这些问题都会导致程序产生异常事件,如被0除溢出、文件找不到、数组下标越界、指定数组长度为负数等等,发生这些事件都将阻止程序正常运行。在Java中,一个方法在运行中出现异常事件时,这个方法将生成一个代表异常的对象,并把它提交给运行时系统,运行时系统会找到相应的代码来处理该事件。抛出异常(throw)与捕捉异常(catch)当程序运行发生异常时,生成异常对象、并把它提交给运行时系统的过程叫做抛出异常。运行时系统在方法的调用栈查找,从生成异常对象的方法进行回溯,直到找到相应异常处理方法为止,这个过程叫做捕捉异常。开始程序发生异常实例化异常对象有try?JVM默认异常处理结束catch1满足?处理异常1catch2满足?有finally?处理异常2异常结束处理YesYesYesYesNoNoNoNo图7.1Java异常捕捉与处理流程2捕捉异常1抛出异常可能产生异常的代码捕捉异常处理异常3处理异常Java异常的种类Java类库中,每个包都定义了异常类,所有这些类都是java.lang.Throwable类的子类;Throwable派生2个子类,Error类和Exception类在Java中的异常类定义:程序中遇到的轻微的错误条件,叫做Exception。在Java中,错误类定义了程序中不可恢复的严重的错误条件,如内存溢出、类文件格式错误等,这类错误由Java运行相同处理,不需要用户处理,这一类叫做Error。ThrowableErrorExceptionRuntimeExceptionIOException运行时问题示例(RuntimeException)importjava.util.Scanner;publicclassExceptionDemo01{publicstaticvoidmain(Stringargs[]){inta,b;Scannersc=newScanner(System.in);System.out.print("Pleaseinputa=");a=sc.nextInt();System.out.print("Pleaseinputb=");b=sc.nextInt();intc=a/b;System.out.println("c="+c); }}从磁盘文件读取数据进行处理(IOException)importjava.io.*;importjava.util.Scanner;publicclassExceptionDemo02{publicstaticvoidmain(Stringargs[]){Stringfilename="Exception.txt";Filef=newFile(filename);Scannersc=newScanner(f); intn;while(sc.hasNextInt()){n=sc.nextInt(); System.out.print("\t"+n);} } }A程序运行时没有进行异常捕捉或声明抛出出错从磁盘文件读取数据进行处理(IOException)7.01在进行磁盘文件操作时,如果没有进行异常捕捉、或者声明抛出,则可能导致()。B程序编译时没有进行异常捕捉或声明抛出出错C运行时磁盘数据文件找不到才会出错D编译时没有找到对应磁盘数据文件出错表7.1常见异常类一览表异常类说明所在包ArithmeticException算术异常,主要因整数除法中被0除引起的。父类:RuntimeExceptionjava.lang.*ArrayStoreException数组存储异常,主要因存储数组元素的对象类型错误引起的。父类:RuntimeExceptionjava.lang.*ArrayIndexOutOfBoundsException访问数组时,索引错误,可能是索引超出数组范围、或者索引为负数。父类:IndexOutOfBoundsExceptionjava.lang.*StringIndexOutOfBoundsException字符串引用索引错误,可能是索引超出数组范围、或者索引为负数。父类:IndexOutOfBoundsExceptionjava.lang.*IndexOutOfBoundsException数组、字符串、矢量的索引超出范围引起的异常。父类:RuntimeExceptionjava.lang.*NegativeArraySizeException在创建数组时,给定的数组大小为负值引起的异常。父类:RuntimeExceptionjava.lang.*FileNotFoundException文件没有找到异常。父类IOExceptionjava.IO.*IOExceptionIO异常,这是一个IO异常基类。父类:Exceptionjava.IO.*异常捕捉与处理在try后“可能出现异常的代码段”的执行中,如果出现异常,系统将生成一个异常的对象,用这个对象与后续的catch中的对象匹配;匹配上后执行对应的“处理异常程序段”;如果没有出现异常,则不会生成异常对象;异常捕捉与处理结构如下:try{
可能出现异常的代码段}catch(异常类1e1){
处理异常程序段}catch(异常类2e2){
处理异常程序段}……[finally{
程序段}]finally结构是一个可选结构,如果有finally结构,只要出现异常,无论是否进行异常处理,都会执行对应的程序段。因此,finally结构一般用来关闭文件、数据库的相关代码,因为出现异常一般程序就需要退出,打开的文件、数据库尚未关闭,将影响其他线程的使用异常捕捉与处理异常捕捉与处理结构如下:try{
可能出现异常的代码段}catch{异常类1e1}{
处理异常程序段}catch(异常类2e2){
处理异常程序段}……[finally{
程序段}]在这个结构中,catch语句可以有多个,允许捕捉多种异常对象。注意,有些异常类存在继承关系,即有父类和子类的关系,如IOException是FileNotFoundException类的父类,而Exception又是IOException的父类。因此,在这些catch语句时,必须先进行子类对象的捕捉,然后在进行父类对象的捕捉;如果先进行父类对象的捕捉,则程序无法通过编译;也就是说,捕捉异常时,要求先捕捉子类、再捕捉父类。下面程序因捕捉异常顺序有错误,编译无法通过importjava.util.Scanner;publicclassExceptionDemo03{publicstaticvoidmain(Stringargs[]){ inta,b; Scannersc=newScanner(System.in); System.out.print("Pleaseinputa="); a=sc.nextInt(); System.out.print("Pleaseinputb="); b=sc.nextInt(); try{ intc=a/b; System.out.println("c="+c); }catch(Exceptione1){ System.out.println("对不起,程序执行错误..."); }catch(ArithmeticExceptione){ System.out.println("对不起,b是除数,不能为0..."); }}}
这类错误是因为异常捕捉顺序有问题导致的。因为Exception异常是ArithmeticException异常的父类,必须先捕捉子类,再捕捉父类。即按照下面反序捕捉:ThrowableExceptionRuntimeExceptionArithmeticException异常捕捉与处理AArithmeticException、RuntimeException、Exception7.02在异常类中,ArithmeticException类继承RuntimeException类,RuntimeException类继承Exception类,如果要捕捉这3类异常,正确的顺序是()。BException、ArithmeticException、RuntimeExceptionCRuntimeException、Exception、ArithmeticExceptionDRuntimeException、ArithmeticException、Exception总结异常:1异常的抛出与捕捉2异常捕捉的基本要求3异常处理2.抛出异常与自定义异常第7章异常处理可抛出异常的方法方法抛出异常格式:如果在一个方法中生成异常,但在这个方法中无法切确知道如何处理这个异常事件,此时,这个方法就应该声明抛出异常,使得异常对象可以从调用栈向后传播,直到有合适的方法步骤它为止。也就是说,这个方法可以把异常抛出给调用者,由调用者来处理这个异常。权限修饰符返回值类型方法名(参数列表)
throws
异常类列表{
方法体}throws是抛出异常关键字异常类列表可以同时抛出多个异常。多个异常类名用逗号分隔抛出异常处理示例importjava.util.*;publicclassThrowsException{publicstaticlongfactorial(intn){//计算机n!longm=1;for(longi=1;i<=n;i++)m*=i;returnm;}publicstaticlong[]sumfact(intn)throwsException{//计算1!+2!+……+n!long[]m=newlong[n];m[0]=0;//ArrayIndexOutOfBoundsExceptionfor(inti=1;i<=n;i++)m[i]=m[i-1]+factorial(i);returnm;} publicstaticvoidmain(Stringargs[])throwsException{intn;longm[];Scannersc=newScanner(System.in);System.out.print("Pleaseinputn=");try{n=sc.nextInt(); m=sumfact(n);System.out.println("m="+m); }catch(ArrayIndexOutOfBoundsExceptione){System.out.println("数组下标越界....");e.printStackTrace();}catch(InputMismatchExceptione){System.out.println("Sorry,pleaseenteraninteger.");e.printStackTrace();} }}
在这个程序中,sumfact(intn)方法中,可能产生数组越界,但在这个方法中不对这个异常进行处理,而是用ThrowsException抛出异常的方式把异常抛给调用它的方法main();在main()中进行了两个异常捕捉:ArrayIndexOutOfBoundsException和InputMismatchException,即数组下标越界和输入类型不匹配;对方法抛出的异常的处理当一个方法接受到异常时,该方法可以处理这些异常,也可以不处理这些异常;但如果不处理,则必须继续抛出异常,此时抛出的异常列表必须与被调用方法的异常列表一致、或者是被调用方法所列异常的兼容父类。main()方法是所有方法的根,如果前面所有方法都没有对抛出的异常进行处理,那么main()方法就应该进行处理。如果main()方法也不处理,还可以继续抛出,此时,抛给Java的虚拟机,由虚拟机进行处理。对方法抛出的异常的处理A任意一个方法都可以抛出异常给调用者7.03一个方法抛出异常(throwsException),下面描述中,错误的是()。B调用者接收到异常时可以继承抛出异常Cmain()方法是所有方法的根,因此它不能再抛出异常D各级方法抛出异常列表必须一致自定义异常与抛出异常自定义异常类 在Java中,我们可以自定义异常,但要求它必须继承Exception类或者Throwable类: publicclass异常类名extendsException{ 异常类的构造方法 }例子:在Java中,长整型的计算没有进行相关的异常类,我们可以自定义一个异常类LongOverflowException,来处理这个问题classLongOverflowExceptionextendsException{publicLongOverflowException(){super("Longoverflow:exceedingthestoragerangeofthelongtype.");}}自定义异常与抛出异常程序自主抛出异常程序自主抛出异常是生成异常对象并抛出的过程。异常对象可以是由虚拟机生成、或者由某类的实例生成,也可以由程序生成。在自主抛出异常方法中,必须由程序生成异常对象,接着用语句: throw(异常对象);
或者throw异常对象;
把异常抛出。例如:LongOverflowExceptione=newLongOverflowException();throwe;注意:用throw语句抛出的异常对象必须是Throwable类、或者其子类、或者自定义异常类的实例,不能抛出其他对象。监控计算过程,当计算值超出long型的容量,抛出异常。importjava.util.*;publicclassThrowLongOverflowException{publicstaticlongfactorial(intn)throwsException{//计算机n!longm=1;for(longi=1;i<=n;i++){m*=i;if(m<0)//为负值时,已经超出long范围,为负值 thrownewLongOverflowException();}returnm;}publicstaticlong[]sumfact(intn)throwsException{//计算1!+2!+……+n!long[]m=newlong[n+1];m[0]=0;for(inti=1;i<=n;i++){//ArrayIndexOutOfBoundsExceptionm[i]=m[i-1]+factorial(i);if(m[i]<0)//由于超出long范围,为负值 thrownewLongOverflowException();}returnm;}监督m值,如果为负值,表示已经超出long的存储范围,抛出异常监督m[i]值,如果为负值,表示已经超出long的存储范围,抛出异常监控计算过程,当计算值超出long型的容量,抛出异常。publicstaticvoidmain(Stringargs[])throwsException{intn;longm[];Scannersc=newScanner(System.in);System.out.print("Pleaseinputn=");try{n=sc.nextInt();m=sumfact(n);for(inti=0;i<m.length;i++) System.out.print("\t"+m[i]);System.out.println(); }catch(ArrayIndexOutOfBoundsExceptione){Sy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公共基础-试验检验师(含助理)《公共基础》模拟试卷5
- 公交车辆电动化发展趋势分析考核试卷
- 2025年体育器材赠与协议
- 2025年仓储物流仓储协议
- 2025年度个人食品加工机械租赁协议4篇
- 2025年度陶瓷原材料加工代理合同3篇
- 2025版学校校园安全设施租赁维护合同模板3篇
- 2025年度新能源汽车充电桩建设与运营合作协议8篇
- 2024能源项目融资合作合同范本3篇
- 2025版木工机械研发与销售木工劳务分包合同协议4篇
- 湖北省黄石市阳新县2024-2025学年八年级上学期数学期末考试题 含答案
- 硝化棉是天然纤维素硝化棉制造行业分析报告
- 央视网2025亚冬会营销方案
- 《00541语言学概论》自考复习题库(含答案)
- 《无砟轨道施工与组织》 课件 第十讲双块式无砟轨道施工工艺
- 江苏省南京市、盐城市2023-2024学年高三上学期期末调研测试+英语+ 含答案
- 2024新版《药品管理法》培训课件
- 《阻燃材料与技术》课件 第7讲 阻燃橡胶材料
- 爆炸物运输安全保障方案
- 江苏省南京市2025届高三学业水平调研考试数学试卷(解析版)
- 2024年黑龙江省哈尔滨市中考数学试卷(附答案)
评论
0/150
提交评论