第9章异常处理(第4版)_第1页
第9章异常处理(第4版)_第2页
第9章异常处理(第4版)_第3页
第9章异常处理(第4版)_第4页
第9章异常处理(第4版)_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、L/O/G/O第第9章章 异常处理异常处理1本章主要内容本章主要内容自定义异常类的设计自定义异常类的设计4异常的定义与分类异常的定义与分类1try-catch-finally语句语句2抛出异常的方式抛出异常的方式32异常异常(exceptionexception) :在程序运行中由代码产生的在程序运行中由代码产生的一种错误一种错误。在不支持异常处理的程序设计语言中,每一个运在不支持异常处理的程序设计语言中,每一个运行错误必须由程序员手动控制。行错误必须由程序员手动控制。JavaJava语言:异常处理机制,将程序运行时的管理语言:异常处理机制,将程序运行时的管理带到面向对象的世界。带到面向对象的

2、世界。3按照错误的性质按照错误的性质分类:分类:语法错:语法错:是由于违反是由于违反JavaJava的语法规则而产生的错的语法规则而产生的错误,误,只要没有编译错误,才可生成字节码。只要没有编译错误,才可生成字节码。语义错语义错(运行错)(运行错):程序在语法上正确,但在语程序在语法上正确,但在语义上存在错误,如输入数据格式错、除数为义上存在错误,如输入数据格式错、除数为0 0错、错、给变量赋值超出其允许范围等给变量赋值超出其允许范围等,这类错误只能在,这类错误只能在运行时发现,有的还需进行异常处理。运行时发现,有的还需进行异常处理。逻辑错:逻辑错:程序编译通过,也可运行,但运行结果程序编译通

3、过,也可运行,但运行结果与预期不符。如由于循环条件不正确而没有结果,与预期不符。如由于循环条件不正确而没有结果,循环次数不对等因素导致的计算结果不正确等。循环次数不对等因素导致的计算结果不正确等。 只有凭借经验排查。只有凭借经验排查。4根据错误严重程度的不同根据错误严重程度的不同将将运行错运行错分类:分类:错误:错误:是指程序在执行过程中所遇到的硬件或是指程序在执行过程中所遇到的硬件或操作系统的错误操作系统的错误,是致命的,需外界干预,是致命的,需外界干预。如:如:内存溢出、虚拟机错等。内存溢出、虚拟机错等。异常:异常:是指在硬件和操作系统正常时,程序遇是指在硬件和操作系统正常时,程序遇到的运

4、行错。到的运行错。如数组越界、除数为如数组越界、除数为0 0、操作数、操作数超出数据范围等、异常不是致命的,但会导致超出数据范围等、异常不是致命的,但会导致程序非正常终止,异常处理机制使程序自身能程序非正常终止,异常处理机制使程序自身能够捕获和处理异常。够捕获和处理异常。5异常异常(类)(类):是指程序在运行过程中发生由于算法:是指程序在运行过程中发生由于算法考虑不周或软件设计错误等导致的程序异常事件考虑不周或软件设计错误等导致的程序异常事件。抛出异常:在一个程序运行过程中,如果发生了异抛出异常:在一个程序运行过程中,如果发生了异常事件,则产生一个代表该异常的常事件,则产生一个代表该异常的对象

5、对象,并把它提,并把它提交给运行系统的过程称为抛出交给运行系统的过程称为抛出(throw)(throw)异常。异常。捕获异常:异常抛出后,运行系统从生成异常对象捕获异常:异常抛出后,运行系统从生成异常对象的代码开始,沿方法的调用栈逐层回溯查找,直到的代码开始,沿方法的调用栈逐层回溯查找,直到找到包含相应异常处理的方法,并把异常对象提交找到包含相应异常处理的方法,并把异常对象提交给该方法为止,这个过程称为捕获给该方法为止,这个过程称为捕获(catch)(catch)异常。异常。6异常对象可由应用程异常对象可由应用程序本身产生,也可能序本身产生,也可能由由JVM产生产生JavaJava异常处理机制

6、:异常处理机制:JavaJava中定义了很多异常类,中定义了很多异常类,每个异常类代表一种运行错误,类中包含了该运每个异常类代表一种运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。每当行错误的信息和处理错误的方法等内容。每当JavaJava程序运行过程中产生一个可识别的运行错误程序运行过程中产生一个可识别的运行错误时,系统都会产生一个相应的该异常类的对象。时,系统都会产生一个相应的该异常类的对象。一旦一个异常对象产生了,系统中就一定有相应一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,从而保证整个程序运行的安全的机制来处理它,从而保证整个程序运行的安全性。性。7在在“异常

7、异常”类层次上的最上层有一个单独的类叫类层次上的最上层有一个单独的类叫做做ThrowableThrowable,它是,它是java.langjava.lang包中的一个类。包中的一个类。java.lang.Errorjava.lang.Error:由系统保留,通常由系统保留,通常JavaJava程序不对程序不对这种错误进行直接处理,必须交由操作系统处理这种错误进行直接处理,必须交由操作系统处理。java.lang.Exceptionjava.lang.Exception:供应用程序使用的,它是用供应用程序使用的,它是用户程序能够捕捉到的异常情况。户程序能够捕捉到的异常情况。8Exception

8、Exception构造方法:构造方法:public Exceptionpublic Exception();();public Exceptionpublic Exception(String sString s); ; Exception Exception常用方法:常用方法:public String toString()public String toString():该方法返回描述当前:该方法返回描述当前ExceptionException类信息的字符串。类信息的字符串。public void printStackTrace()public void printStackTrace()

9、:该方法没有返回值,它:该方法没有返回值,它的功能是完成一个输出操作,在当前的标准输出设的功能是完成一个输出操作,在当前的标准输出设备(一般是屏幕显示器)上输出当前异常对象的堆备(一般是屏幕显示器)上输出当前异常对象的堆栈使用轨迹,即程序先后调用并执行了哪些对象或栈使用轨迹,即程序先后调用并执行了哪些对象或类的哪些方法,使得运行过程中产生了这个异常对类的哪些方法,使得运行过程中产生了这个异常对象。象。通常是对该异通常是对该异常所对应的错常所对应的错误描述。误描述。9异常类的层次结构如教材图异常类的层次结构如教材图9.19.1所示。所示。程序对错误与异常的处理方式有三种:程序对错误与异常的处理方

10、式有三种:一是程序不能处理的错误一是程序不能处理的错误,交操作系统处理,交操作系统处理;二是程序应避免而可以不去捕获的运行时异常二是程序应避免而可以不去捕获的运行时异常(RuntimeExceptionRuntimeException);三是必须捕获三是必须捕获(使用(使用try-catch-finaltry-catch-final)的非运行时异常。的非运行时异常。10异常类异常类异常处理是通过异常处理是通过trytry、catchcatch、finallyfinally、throwthrow、throwsthrows五个关键字来实现的。五个关键字来实现的。异常的产生异常的产生使用使用try-

11、catch-finallytry-catch-finally语句捕获和处理异常语句捕获和处理异常捕获异常的意义:能让程序来接收和处理异常捕获异常的意义:能让程序来接收和处理异常对象,从而不影响其他语句的执行。对象,从而不影响其他语句的执行。11使用使用try-catch-finallytry-catch-finally语句捕获和处理异常语句捕获和处理异常捕获异常:当一个异常被抛出时,有专门的语捕获异常:当一个异常被抛出时,有专门的语句来接收这个被抛出的异常对象。当一个异常句来接收这个被抛出的异常对象。当一个异常类的对象被捕获或接收后,用户程序就会发生类的对象被捕获或接收后,用户程序就会发生流程

12、跳转,系统终止当前的流转而跳转到专门流程跳转,系统终止当前的流转而跳转到专门的异常处理语句块,或直接跳出当前程序和的异常处理语句块,或直接跳出当前程序和JVMJVM回到操作系统。回到操作系统。12使用使用try-catch-finallytry-catch-finally语句捕获和处理异常语句捕获和处理异常try-catch-finallytry-catch-finally语句语法格式:语句语法格式:try 要检查的语句序列要检查的语句序列 ;/可能产生异常的代码可能产生异常的代码catch (异常类名异常类名 形参对象名形参对象名) 异常发生时的处理语句序列异常发生时的处理语句序列;/捕获到

13、某种异常对象时进行处理捕获到某种异常对象时进行处理 /的代码的代码finally 一定会运行的语句序列一定会运行的语句序列13try-catch-finallytry-catch-finally语句捕获和处理异常语句捕获和处理异常的顺序:的顺序:trytry块中代码抛出异常,若发生异常,则程序的运行块中代码抛出异常,若发生异常,则程序的运行便中断,并抛出由便中断,并抛出由“异常类异常类”所产生的所产生的“对象对象”。同时,该代码块也指定了它后面的同时,该代码块也指定了它后面的catchcatch语句所捕获语句所捕获的异常的范围,每个的异常的范围,每个catchcatch块都应该与一个块都应该与

14、一个trytry语句块语句块相对应,这个相对应,这个trytry语句块用来启动语句块用来启动JavaJava的异常处理机制。的异常处理机制。catchcatch用来指定需要捕获的异常类型用来指定需要捕获的异常类型,捕获到捕获到异常异常,然后流程自动跳过产生异常的语句后面的所有尚未然后流程自动跳过产生异常的语句后面的所有尚未执行的语句,系统就直接跳到执行的语句,系统就直接跳到catchcatch语句中,查看是语句中,查看是否有匹配的异常类否有匹配的异常类,若有就执行相应语句。,若有就执行相应语句。14try-catch-finallytry-catch-finally语句捕获和处理异常语句捕获和

15、处理异常的顺序:的顺序:无论无论trytry程序块是否捕获到异常,或者捕获到的异程序块是否捕获到异常,或者捕获到的异常是否与常是否与catchcatch后面括号里的异常相同,最后一定后面括号里的异常相同,最后一定会运行会运行finallyfinally块里的程序代码;块里的程序代码;finallyfinally块的代码运块的代码运行结束后,程序再转到行结束后,程序再转到try-catch-finallytry-catch-finally块之后的块之后的语句继续运行。语句继续运行。若若trytry块中所有的语句都没有引发异常,则所有的块中所有的语句都没有引发异常,则所有的catchcatch块都

16、会被忽略而不执行。块都会被忽略而不执行。15多异常处理多异常处理通过一个通过一个trytry块后面定义若干块后面定义若干catchcatch块来实现的,每个块来实现的,每个catchcatch块用来接收和处理一种特定的异常对象。块用来接收和处理一种特定的异常对象。若若trytry块产生的异常对象被第一个块产生的异常对象被第一个catchcatch块所接收,则块所接收,则程序的流程将直接跳转到这个程序的流程将直接跳转到这个catchcatch语句块中,语句块中,trytry块块中尚未执行的语句和其他的中尚未执行的语句和其他的catchcatch块将被忽略。块将被忽略。若若trytry块产生的异常

17、对象与第一个块产生的异常对象与第一个catchcatch块不匹配,系统将块不匹配,系统将自动转到第二个自动转到第二个catchcatch块进行匹配块进行匹配,依次类推,直到依次类推,直到找到一个可以接收该异常对象的找到一个可以接收该异常对象的catchcatch块,即完成流块,即完成流程的跳转。程的跳转。见见P教材例教材例9.2见教材中的说明见教材中的说明16抛出异常的方法抛出异常的方法系统自动抛出的异常:所有系统定义的运行异常都系统自动抛出的异常:所有系统定义的运行异常都可以由系统自动抛出。可以由系统自动抛出。使用使用throwthrow语句抛出的异常:语句抛出的异常:throwthrow语

18、句来定义何种情语句来定义何种情况算是产生了此种异常对应的错误,并应该抛出这况算是产生了此种异常对应的错误,并应该抛出这个异常类的对象。使用个异常类的对象。使用throwthrow语句抛出异常对象的语语句抛出异常对象的语法格式为:法格式为:在一个方法内使用在一个方法内使用throwthrow抛出异常对象,若该方法内抛出异常对象,若该方法内部没有用部没有用try-catchtry-catch对这个抛出的异常进行处理,则此对这个抛出的异常进行处理,则此方法应声明抛出异常,由其调用着处理。方法应声明抛出异常,由其调用着处理。 throw 由异常类所产生的对象;由异常类所产生的对象;见教材见教材 例例9

19、.417抛出异常的方法与调用方法处理异常抛出异常的方法与调用方法处理异常如果在一个程序中的异常没有用如果在一个程序中的异常没有用try-catchtry-catch语句捕获异语句捕获异常和处理异常的代码,则可以在程序代码所在的方常和处理异常的代码,则可以在程序代码所在的方法声明的后面用法声明的后面用throwsthrows关键字声明该方法要抛出异常,关键字声明该方法要抛出异常,将该异常抛出到该方法的调用方法中,一直可追溯将该异常抛出到该方法的调用方法中,一直可追溯到到main()main()方法,方法,JVMJVM肯定要处理的,这样编译就可以肯定要处理的,这样编译就可以通过了。在方法声明中添加

20、通过了。在方法声明中添加throwsthrows子句表示方法将抛子句表示方法将抛出异常。带有出异常。带有throwsthrows子句的方法其声明格式如下子句的方法其声明格式如下: 修饰符修饰符 返回值类型返回值类型 方法名方法名(参数列表参数列表) throws 异常类列表异常类列表见教材见教材 例例9.518由方法抛出异常交系统处理由方法抛出异常交系统处理对于程序需要处理的异常,一般编写对于程序需要处理的异常,一般编写try-try-catch-finallycatch-finally语句捕获并处理,而对于程序中无语句捕获并处理,而对于程序中无法处理必须交由系统处理的异常,由于系统直法处理必须交由系统处理的异常,由于系统直接调用的是主方法接调用的是主方法main()main(),所以可以在主方法,所以可以在主方法中使用中使用throwsthrows子句声明抛出异常交由系统处理。子句声明抛出异常交由系统处理。如下面的程序,

温馨提示

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

最新文档

评论

0/150

提交评论