异常处理PPT演示课件_第1页
异常处理PPT演示课件_第2页
异常处理PPT演示课件_第3页
异常处理PPT演示课件_第4页
异常处理PPT演示课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

Java语言程序设计实用教程,1,第九讲异常处理,2,3,本章学习要点:,理解异常的概念掌握运用try块、catch块和finally块处理异常掌握运用多重catch块处理异常掌握运用嵌套try/catch块处理异常掌握运用关键字throw和throws引发异常掌握运用Java编写和使用自定义异常,3,异常的概念,4,异常的概念,所谓异常,是指由于程序运行时发生错误,从而导致程序错误结束。内存用完找不到文件网络连接故障良好的程序除具有用户所需求的功能外,还应该具备预见并处理可能发生的各种异常的功能,5,异常的概念,Java给程序员提供了处理运行时错误的功能,称为异常处理。没有异常处理代码的程序,在运行时发生错误则可能非正常结束,引起严重问题。例如,程序将钱从储蓄账户转账到经常账户时,当钱从储蓄账户提出还未存入经常账户时,由于运行时错误,程序终止,用户就会损失掉这笔钱。,6,异常类,在java的异常处理机制中,定义了很多用来描述和处理异常的类,称为异常类。所有的异常类都直接或间接从Throwable类继承。,7,异常类,Throwable类有两个直接子类:Error类及Exception类,后者是Java程序中需要大量处理的。Error类描述的是内部系统错误,包括动态链接失败、虚拟机错误等,Java程序不做处理。Exception类描述的是程序和外部环境引起的错误,这些错误能通过程序捕获和处理每种异常类对应着某一种或者一类错误,类中可以包含该运行的错误信息和处理错误的方法等内容。,8,常用的RuntimeException类的子类,RuntimeException类是Exception类的子类,用来描述编程错误。如被0除等系统错误、数组下标超范围等。它一般由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序。1)算术异常ArithmeticException该异常类型在进行数学运算过程中,由于除法运算中的除数为0,则产生算术异常。2)数组越界异常IndexOutOfBandsException该异常用于在数组等数据元素有一定范围的数据存储结构中,当数组存储超过指定界限时产生。3)类型转换异常ClassCastException该类异常时由于在变量类型转换过程中,被转换变量无法转换为指定类型的变量所导致。,9,常用的RuntimeException类的子类(二),4)未找到类定义异常NoClassDefFoundException如果Java程序在编译过程中,根据Java源程序指定的包路径没有发现指定的类,则抛出该异常。5)安全异常SecurityException当Java系统检测到违反安全的行为,则抛出该异常。6)空指针异常NullPointerException除了Java类库所定义的异常类之外,用户也可以通过继承已有的异常类来定义自己的异常类,并在程序中使用。,10,PublicStringtoString():返回描述当前异常对象信息的字符串PublicStringgetMessage():返回描述当前异常对象的详细信息。PublicvoidprintStackTrace():没有返回值,通常是在屏幕上打印输出当前异常对象使用堆栈的轨迹,即程序先后调用了好些方法。,Exception的方法,11,在执行某个java程序的过程中,运行时系统随时对它进行监控每当程序运行过程中发生一个可识别的错误,即这个错误有一个异常类与之对应,系统就会产生这个异常类的一个对象,把当前的进程停止,并将这个异常抛出。,异常的处理过程,12,当JAVA运行时系统得到一个异常对象时,它会寻找处理这一异常的代码,从当前方法,按堆栈的顺序从下向上查找.直到找到一个方法能够处理这种异常为止.然后把异常对象交给它进行处理.这个过程称为捕获异常。JAVA的异常处理机制就是由捕获异常和抛出异常两部分组成。,异常的处理过程,13,异常处理的方法,14,Java中如何进行异常处理,Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws,捕获异常,catch,try,finally,执行可能产生异常的代码,捕获异常,无论是否发生异常,代码总能执行,手动抛出异常,抛出异常,throw,声明异常,声明方法可能要抛出的各种异常,throws,15,try/catch块7-1,try,catch,try/catch块后的代码段,publicvoidmethod()try/代码段(此处不会产生异常)catch(异常类型ex)/对异常进行处理的代码段/代码段,使用try/catch块捕获异常,分为三种情况:,第一种情况,16,try/catch块7-2,使用示例模拟第一种情况:,publicclassAccpExceptionpublicstaticvoidmain(Stringargs)System.out.print(请输入课程代号(1至3之间的数字):);Scannerin=newScanner(System.in);tryintcourseCode=in.nextInt();switch(courseCode)case1:System.out.println(C#编程);break;case2:System.out.println(Java编程);break;case3:System.out.println(SQL基础);catch(Exceptionex)System.out.println(输入不为数字!);System.out.println(欢迎提出建议!);,输入:2,Java编程欢迎提出建议!,控制台输出,17,try/catch块7-3,try,catch,异常类型匹配,try/catch块后的代码段,进入catch块,publicvoidmethod()try/代码段1/产生异常的代码段2/代码段3catch(异常类型ex)/对异常进行处理的代码段4/代码段5,使用try/catch块捕获异常,分为三种情况:,第二种情况,产生异常对象,程序继续执行,异常是一种特殊的对象,类型为java.lang.Exception或其子类,发生异常,18,try/catch块7-4,使用示例模拟第二种情况:,publicclassAccpExceptionpublicstaticvoidmain(Stringargs)System.out.print(请输入课程代号(1至3之间的数字):);Scannerin=newScanner(System.in);tryintcourseCode=in.nextInt();switch(courseCode)case1:System.out.println(C#编程);break;case2:System.out.println(Java编程);break;case3:System.out.println(SQL基础);catch(Exceptionex)System.out.println(输入不为数字!);ex.printStackTrace();System.out.println(欢迎提出建议!);,输入:B,输入不为数字!异常堆栈信息欢迎提出建议!,控制台输出,19,printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,publicclassAccpExceptionpublicstaticvoidmain(Stringargs)System.out.print(请输入课程代号(1至3之间的数字):);Scannerin=newScanner(System.in);tryintcourseCode=in.nextInt();/此处代码省略catch(Exceptionex)System.out.println(输入不为数字!);ex.printStackTrace();System.out.println(欢迎提出建议!);,try/catch块7-5,20,try/catch块7-6,try,catch,异常类型不匹配,try/catch块后的代码段,程序中断运行,发生异常,publicvoidmethod()try/代码段1/产生异常的代码段2/代码段3catch(异常类型ex)/对异常进行处理的代码段4/代码段5,使用try/catch块捕获异常,分为三种情况:,第三种情况,产生异常对象,21,try/catch块7-7,使用示例模拟第三种情况:,publicclassAccpException2publicstaticvoidmain(Stringargs)System.out.print(请输入课程代号(1至3之间的数字):);Scannerin=newScanner(System.in);tryintcourseCode=in.nextInt();switch(courseCode)case1:System.out.println(C#编程);break;case2:System.out.println(Java编程);break;case3:System.out.println(SQL基础);catch(NullPointerExceptionex)System.out.println(输入不为数字!);System.out.println(欢迎提出建议!);,输入:B,程序中断运行,22,try/catch/finally2-1,在try/catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行,try块,finally块,catch块,无异常,有异常,23,try/catch/finally2-2,publicclassAccpException3publicstaticvoidmain(Stringargs)System.out.print(请输入课程代号(1至3之间的数字):);Scannerin=newScanner(System.in);tryintcourseCode=in.nextInt();switch(courseCode)case1:System.out.println(C#编程);break;case2:System.out.println(Java编程);break;case3:System.out.println(SQL基础);catch(Exceptionex)System.out.println(输入不为数字!);finallySystem.out.println(欢迎提出建议!);,输入:2,Java编程欢迎提出建议!,控制台输出,输入:B,输入不为数字!欢迎提出建议!,第一种情况:无异常,第二种情况:有异常,24,异常处理方法,异常处理的方法有两种:一种是使用trycatchfinally对异常进行捕获,方法自身对异常进行捕获;另一种是通过throws和throw抛出异常,让调用它的方法对异常进行处理。,25,try.catchfinally结构,try可能出现异常的程序代码catch(异常类名1异常对象名1)异常类名1对应的异常处理代码catch(异常类名2异常对象名2)异常类名2对应的异常处理代码finally必须执行的代码,26,用try选定捕获例外的范围,由try所限定的语句在执行过程中可能会生成例外对象并抛弃。try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的例外对象。catch语句中形参指明它所能够捕获的例外对象。捕获例外的顺序和catch语句的顺序有关,当捕获到一个例外时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的例外,然后再逐渐一般化。也就是一般先安排子类,再安排父类。finally是可选项,通过finally语句为例外处理提供一个统一的出口。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。,说明,27,有时,块的一部分引起一个错误,而整个块可能又引起另一个错误。在此情况下,需要将一个异常处理程序嵌套到另一个中。在使用嵌套的try块时,将先执行内部try块,如果没有遇到匹配的catch块,则将检查外部try块的catch块。,嵌套的try-catch块,28,多重catch块2-1,一段代码可能会引发多种类型的异常当引发异常时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句执行其中的一条catch语句之后,其后的catch语句将被忽略,29,publicvoidmethod()try/代码段/产生异常(异常类型2)catch(异常类型1ex)/对异常进行处理的代码段catch(异常类型2ex)/对异常进行处理的代码段catch(异常类型3ex)/对异常进行处理的代码段/代码段,多重catch块2-1,try,与异常类型1不匹配,try/catch块后的代码段,发生异常,产生异常对象,catch,与异常类型2匹配,catch,catch,程序继续执行,进入catch块,30,多重catch块2-2,publicclassAccpException4publicstaticvoidmain(Stringargs)Scannerin=newScanner(System.in);trySystem.out.print(“请输入S1的总学时:);inttotalTime=in.nextInt();/总学时System.out.print(“请输入S1的课程数目:);inttotalCourse=in.nextInt();/课程数目System.out.println(“S1各课程的平均学时为:+totalTime/totalCourse);catch(InputMismatchExceptione1)System.out.println(输入不为数字!);catch(ArithmeticExceptione2)System.out.println(课程数目不能为零!);catch(Exceptione)System.out.println(发生错误:+e.getMessage();,输入:270H,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类,输出:输入不为数字!,进入第一个catch块,输入:2700,输出:课程数目不能为零!,进入第二个catch块,31,抛出异常,分两种情况:在语句执行时抛出异常,一般用于自定义异常类,程序员通过该语句抛出异常类对象。:thrownew异常类名(信息)在方法定义时声明抛出异常,如果一个方法可能产生异常,而自己又不准备处理它,可以在方法声明时使用throws选项,以抛出异常,让调用它的方法捕获异常对象,并对它进行处理。修饰符返回值类型方法名throws异常类名方法体,32,抛出异常,如果在当前环境无法解决一个异常,就要将其抛出,把异常交给调用者处理,publicclassAccpTeacherprivateStringid;/教员编号,长度应为7publicvoidsetId(StringpId)/判断教员编号的长度是否为7if(pId.length()=7)id=pId;elsethrownewIllegalArgumentException(参数长度应为7!);,publicclassAccpTeacherTestpublicstaticvoidmain(Stringargs)AccpTeacherteacher=newAccpTeacher();tryteacher.setId(088);catch(IllegalArgumentExceptionex)System.out.println(ex.getMessage();,抛出异常,捕获异常,参数长度应为7!,控制台输出,33,声明异常,publicclassAccpTeacherprivateStringid;/教员编号,长度应为7publicvoidsetId(StringpId)throwsIllegalArgumentException/判断教员编号的长度是否为7if(pId.length()=7)id=pId;elsethrownewIllegalArgumentException(参数长度应为7!);,publicclassAccpTeacherTestpublicstaticvoidmain(Stringargs)AccpTeacherteacher=newAccpTeacher();tryteacher.setId(088);catch(IllegalArgumentExceptionex)System.out.println(ex.getMessage();,由调用者捕获异常,声明该方法可能会产生异常,34,抛出自己的异常,throw语句用来明确地抛出一个“异常”。throw关键字后面跟着我们要抛出的异常。这个异常可以使我们自己新建的,或者是通过catch捕获到的publicclassThrowDemopublicstaticvoidmain(Stringargs)trythrownewArithmeticException(hello);catch(ArithmeticExceptione)System.out.println(被除数不能为零);,35,函数抛出异常,throws用来标明一个成员函数可能抛出的各种“异常”。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。publicclassThrowsDemopublicstaticintmythrow(intfirst,intsecond)throwsArithmeticExceptionintc=first/second;r

温馨提示

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

评论

0/150

提交评论