JAVA的异常处理机制2010_第1页
JAVA的异常处理机制2010_第2页
JAVA的异常处理机制2010_第3页
JAVA的异常处理机制2010_第4页
JAVA的异常处理机制2010_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章第六章 异常处理异常处理第六章第六章 异常处理异常处理6.1 6.1 异常的概念异常的概念v 何谓异常?何谓异常? 程序运行时,发生的各种错误,称为异常。程序运行时,发生的各种错误,称为异常。 用户编制的程序如果无词法和句法错误,编译时能顺利通过,生成字节码文件。用户编制的程序如果无词法和句法错误,编译时能顺利通过,生成字节码文件。但是,程序运行时,还可能发生各种错误,例如:除数为但是,程序运行时,还可能发生各种错误,例如:除数为0,数组越界,文件找,数组越界,文件找不到等,一旦发生这些错误,通常阻止程序的正常运行。不到等,一旦发生这些错误,通常阻止程序的正常运行。 java语言提供了异

2、常处理机制,程序运行过程中,任何一个错误发生时,系统语言提供了异常处理机制,程序运行过程中,任何一个错误发生时,系统都会找到与该错误对应的一个类,由该类产生一个错误对象,通过错误对象输出都会找到与该错误对应的一个类,由该类产生一个错误对象,通过错误对象输出 错误发生原因的提示信息,帮助用户迅速纠正错误。错误发生原因的提示信息,帮助用户迅速纠正错误。 例题:例题:exception.jpx Ex_Exception3.java6.2.1 6.2.1 异常处理机制异常处理机制v 何谓抛出异常?何谓抛出异常? 程序运行时,如果发生了某种错误,系统中断程序正常运行,并且能迅程序运行时,如果发生了某种错

3、误,系统中断程序正常运行,并且能迅速诊断出该错误的类型,从系统已经定义好的一组异常类中或用户自定速诊断出该错误的类型,从系统已经定义好的一组异常类中或用户自定义的一组异常类中找出对应的异常类,生成一个异常类对象义的一组异常类中找出对应的异常类,生成一个异常类对象 。 把错误的产生、生成异常对象及提交给信息窗口的过程,称为抛出异常。把错误的产生、生成异常对象及提交给信息窗口的过程,称为抛出异常。v 何谓捕获异常?何谓捕获异常? 抛出异常后,系统会从生成对象的代码块开始,沿方法的调用栈逐层抛出异常后,系统会从生成对象的代码块开始,沿方法的调用栈逐层回溯,寻找相应的处理代码,并把异常对象交给该方法处

4、理。这个过程回溯,寻找相应的处理代码,并把异常对象交给该方法处理。这个过程称为捕获异常。称为捕获异常。 这种异常处理机制这种异常处理机制将错误处理代码从常规代码中分离出来。将错误处理代码从常规代码中分离出来。 IgnoredException.java TestException1.java 第六章第六章 异常处理异常处理第六章第六章 异常处理异常处理6.2.1 6.2.1 异常的处理机制异常的处理机制v 举例举例【6-7】 模拟系统抛出异常和捕获异常的过程。模拟系统抛出异常和捕获异常的过程。 讲解:程序运行过程中,任何一个错误发生时,系统会找到与该错误对讲解:程序运行过程中,任何一个错误发生

5、时,系统会找到与该错误对应的一个类,由该类产生一个异常对象,通过应的一个类,由该类产生一个异常对象,通过throw 语句抛出该对象。语句抛出该对象。这时程序不再顺序往下执行,系统自动寻找处理该异常对象的方法,找这时程序不再顺序往下执行,系统自动寻找处理该异常对象的方法,找到该方法后,由该方法中的语句输出错误产生的原因和错误所发生的位到该方法后,由该方法中的语句输出错误产生的原因和错误所发生的位置。置。 第六章 异常处理6.1.2 6.1.2 异常的分类异常的分类 java语言制作了很多异常类,每个异常类都代表了一种运行错误,类语言制作了很多异常类,每个异常类都代表了一种运行错误,类中包含了该运

6、行错误的信息和处理错误方法的方法等内容。介绍图表。中包含了该运行错误的信息和处理错误方法的方法等内容。介绍图表。 每当每当java程序运行过程中,发生了一个可识别的运行错误时,即该错误程序运行过程中,发生了一个可识别的运行错误时,即该错误有一个异常类与之对应,系统都会产生一个相应的该异常类的对象,即抛有一个异常类与之对应,系统都会产生一个相应的该异常类的对象,即抛出异常。出异常。 然后再捕获异常。即:系统自动寻找处理该异常对象的方法,找到该方然后再捕获异常。即:系统自动寻找处理该异常对象的方法,找到该方法后,由该方法中的语句输出错误产生的原因和错误所发生的位置。法后,由该方法中的语句输出错误产

7、生的原因和错误所发生的位置。 第六章 异常处理6.1.2 6.1.2 异常的分类异常的分类 java语言提供一组具有继承关系的异常类。解释图:语言提供一组具有继承关系的异常类。解释图: Throwable 类是所有处理异常类的根类,下面又可以分为两种类型:类是所有处理异常类的根类,下面又可以分为两种类型:(throwable 类有两个直接子类:类有两个直接子类:Error 类和类和 Exception类)类) Error 类及其子类所能处理的错误一般都是系统内部的错误,当这些错误类及其子类所能处理的错误一般都是系统内部的错误,当这些错误发生时,程序将终止运行发生时,程序将终止运行 (这类错误通

8、常不是程序员责任这类错误通常不是程序员责任) 。 比如:内存溢出,动态联接错误。当程序运行发生这种类型错误时,由比如:内存溢出,动态联接错误。当程序运行发生这种类型错误时,由java虚拟机捕获这些错误,并分析得到这些错误发生的类型,从虚拟机捕获这些错误,并分析得到这些错误发生的类型,从Error 类找类找出这组类中的对应的类,产生异常对象并调用这些异常对象的方法,提供错出这组类中的对应的类,产生异常对象并调用这些异常对象的方法,提供错误发生原因的提示信息。误发生原因的提示信息。 综上所述,综上所述,Error 类及其子类所处理的错误,仅能提供错误产生的原因,类及其子类所处理的错误,仅能提供错误

9、产生的原因,不能纠正程序中的错误,恢复程序正常运行。所以用户对于这种类型的错误,不能纠正程序中的错误,恢复程序正常运行。所以用户对于这种类型的错误,无须考虑如何纠正处理,完全交给无须考虑如何纠正处理,完全交给java虚拟机处理。虚拟机处理。第六章 异常处理6.1.2 6.1.2 异常的分类异常的分类 Exception 类及其子类所处理的错误类型是可以纠正的错误类及其子类所处理的错误类型是可以纠正的错误 (这类错误通常是这类错误通常是程序员编码不当造成的程序员编码不当造成的) 。 当上述类型错误发生时,系统不仅能提供产生错误的原因,如果用户正确使用当上述类型错误发生时,系统不仅能提供产生错误的

10、原因,如果用户正确使用try-catch-finally语句来处理这些错误,还可以通过程序自身能纠正错误,恢复程语句来处理这些错误,还可以通过程序自身能纠正错误,恢复程序正常运行。序正常运行。 把把Exception 类及其子类所处理的错误类型分成两种类型:类及其子类所处理的错误类型分成两种类型: (1)执行异常(不受检查型异常)执行异常(不受检查型异常) (2)检查型异常)检查型异常v 执行异常执行异常 IgnoredException.java Exception 类有一个直接子类,类有一个直接子类, RuntimeException 类。类。 RuntimeException类及子类所处

11、理的各种异常称为执行异常。类及子类所处理的各种异常称为执行异常。 该类所能处理的各种错误类型,如图所示:该类所能处理的各种错误类型,如图所示: 对程序中可能引起上述错误的语句,编译器在编译时可以不对这些语句做检查,对程序中可能引起上述错误的语句,编译器在编译时可以不对这些语句做检查,所以称为非检查型异常。所以称为非检查型异常。第六章 异常处理 RuntimeException 类及其子类介绍。类及其子类介绍。该类所能处理的错误类型,如图所示:该类所能处理的错误类型,如图所示:ArithmeticException算术错误,如做整数除法时,除数为算术错误,如做整数除法时,除数为0ArrayInd

12、exOutOfBoundsException数组下标越界数组下标越界ArrayStoreException数组元素赋值类型不兼容数组元素赋值类型不兼容NullPointException非法使用空引用非法使用空引用FileNotFoundException试图存取一个并不存在的文件试图存取一个并不存在的文件IOException通常的通常的I/O错误错误NegativeArraySizeException创建数组时,如果数组元素个数是负数创建数组时,如果数组元素个数是负数第六章 异常处理6.1.2 6.1.2 异常的分类异常的分类v RuntimeException 的子类对上述错误的处理可以

13、采用两种方式:的子类对上述错误的处理可以采用两种方式:(1)对程序中可能引起上述错误的语句,用户可以不使用)对程序中可能引起上述错误的语句,用户可以不使用try-catch-finally语句对这语句对这些可能引起错误进行处理,编译能够顺利通过。但是,当这些错误发生时,由些可能引起错误进行处理,编译能够顺利通过。但是,当这些错误发生时,由java虚拟机对这些错误进行监测并处理,产生异常对象,在屏幕上提供错误产生虚拟机对这些错误进行监测并处理,产生异常对象,在屏幕上提供错误产生的原因。的原因。 但是,由于用户在程序中未编写处理错误的语句,所以当错误发生时,程序自但是,由于用户在程序中未编写处理错

14、误的语句,所以当错误发生时,程序自身不能纠正错误,恢复程序正常运行。身不能纠正错误,恢复程序正常运行。(2)用户正确使用)用户正确使用try-catch-finally语句,不但编译能够顺利通过,而且当这些错误语句,不但编译能够顺利通过,而且当这些错误发生时,能提供错误发生的原因,并且通过程序自身能纠正错误,恢复程序正常发生时,能提供错误发生的原因,并且通过程序自身能纠正错误,恢复程序正常运行。运行。 如果用户在程序中,对可能发生如果用户在程序中,对可能发生RuntimeException 类及其子类所对应错误的类及其子类所对应错误的语句进行处理,采用语句进行处理,采用try和和catch语句

15、。把可能发生错误的那些语句用语句。把可能发生错误的那些语句用try 语句将其语句将其包围起来,程序运行时可能发生的异常语句将抛出异常对象,然后在包围起来,程序运行时可能发生的异常语句将抛出异常对象,然后在catch 块语块语句中进行处理。句中进行处理。第六章 异常处理6.1.2 6.1.2 异常的分类异常的分类vException 类的其他直接子类类的其他直接子类(非运行时异常类非运行时异常类): 该组类所处理的各种异常称为检查型异常。该组类所处理的各种异常称为检查型异常。 对程序中可能引起上述错误的语句,编译器在编译时,对这些语句必须做检查,所以对程序中可能引起上述错误的语句,编译器在编译时

16、,对这些语句必须做检查,所以称为检查型异常。称为检查型异常。 如果编译时发现有可能引起上述错误的语句,而用户未做任何处理,那么编译将不如果编译时发现有可能引起上述错误的语句,而用户未做任何处理,那么编译将不能通过。能通过。 对这类错误,用户可以有两种方式进行处理:对这类错误,用户可以有两种方式进行处理: (1)采用)采用try-catch语句将可能引起这类错误的语句包装起来,如果用户对语句将可能引起这类错误的语句包装起来,如果用户对try-catch语句使用得当,当这类错误发生时,不仅能发现错误,还可以纠正错误。语句使用得当,当这类错误发生时,不仅能发现错误,还可以纠正错误。 (2)对可能引起

17、上述错误的语句所在的方法声明抛出异常语句,抛出这些错误语句)对可能引起上述错误的语句所在的方法声明抛出异常语句,抛出这些错误语句可能发生的异常种类。当这类错误发生时,交由系统处理。这时系统仅能给出错误提可能发生的异常种类。当这类错误发生时,交由系统处理。这时系统仅能给出错误提示信息,不能纠正错误。示信息,不能纠正错误。 从键盘上读取数据从键盘上读取数据.jpx6.2.2 6.2.2 异常处理方法异常处理方法v trycatch的使用特点:的使用特点: (1) trycatch通常是配对使用。一个通常是配对使用。一个try语句至少有一个语句至少有一个catch语句与之语句与之配对。当然一个配对。

18、当然一个try可以有多个可以有多个catch与之配对。与之配对。try/ 希望进行异常检测的代码块希望进行异常检测的代码块/ 注意:此处不许插入其它语句,必须紧跟注意:此处不许插入其它语句,必须紧跟catchcatch(A e)/ 对异常对异常OneException.进行处理进行处理catch(B e)/ 对异常对异常AnotherException进行处理进行处理v 举例:举例:ExceptionSolution.java HelloWorldMod.java第六章 异常处理6.2.2 6.2.2 异常处理方法异常处理方法vtrycatch的使用特点:的使用特点: (1)在)在try语句限

19、定的范围内的任何一条语句,只要在运行过程中发生了某种异常,语句限定的范围内的任何一条语句,只要在运行过程中发生了某种异常,由系统控制抛出一个与之对应的异常对象,且该语句下面的语句(由系统控制抛出一个与之对应的异常对象,且该语句下面的语句( try语句限定的范围语句限定的范围内)不再执行,系统将控制权由内)不再执行,系统将控制权由try语句转移到语句转移到catch异常处理代码块。异常处理代码块。 如果如果catch语句指定的异常数据类型与系统抛出的异常对象的数据类型相符,系统抛语句指定的异常数据类型与系统抛出的异常对象的数据类型相符,系统抛出的异常对象将作为实际参数赋值给出的异常对象将作为实际

20、参数赋值给catch语句中的形参,然后顺序执行语句中的形参,然后顺序执行catch语句中语句中的内容。的内容。 反之,反之, catch语句指定的异常数据类型与系统抛出的异常对象的数据类型不符,捕语句指定的异常数据类型与系统抛出的异常对象的数据类型不符,捕获异常失败,程序执行自动终止,由系统控制输出一个异常信息。获异常失败,程序执行自动终止,由系统控制输出一个异常信息。 如果在如果在try语句限定的范围内的任何一条语句在运行过程中未发生任何异常,语句限定的范围内的任何一条语句在运行过程中未发生任何异常, catch语句块中的内容将被跳过。语句块中的内容将被跳过。 注意:注意: catch语句指

21、定的异常数据类型与系统抛出的异常对象的数据类型相符的含义语句指定的异常数据类型与系统抛出的异常对象的数据类型相符的含义是:是: catch语句的异常数据类型与异常对象的数据类型完全一致,或是语句的异常数据类型与异常对象的数据类型完全一致,或是catch语句指定语句指定的异常数据类型是异常对象的父类类型。的异常数据类型是异常对象的父类类型。第六章 异常处理6.2.2 6.2.2 异常处理方法异常处理方法 (2)一个)一个try与多个与多个catch配对配对 在在try语句限定的范围内的任何一条语句,只要在运行过程中发生语句限定的范围内的任何一条语句,只要在运行过程中发生了某种异常,由系统控制抛出

22、一个与之对应的异常对象,系统将控制了某种异常,由系统控制抛出一个与之对应的异常对象,系统将控制权由权由try语句转移到语句转移到catch异常处理代码块。异常处理代码块。 然后从上至下逐个判定哪一个然后从上至下逐个判定哪一个catch语句中形参指定的数据类型与语句中形参指定的数据类型与系统抛出的异常对象的数据类型相符,如果找到相符的数据类型,就系统抛出的异常对象的数据类型相符,如果找到相符的数据类型,就会执行这个会执行这个catch语句块中的内容。否则,由系统控制输出异常对象语句块中的内容。否则,由系统控制输出异常对象的信息,且程序执行自动终止。的信息,且程序执行自动终止。 注意:多个注意:多

23、个catch语句的排列方式。一定要根据图语句的排列方式。一定要根据图6-1的层次结构图,的层次结构图,从子类到父类顺序排列。否则,子类的从子类到父类顺序排列。否则,子类的catch语句永远也执行不到。语句永远也执行不到。第六章 异常处理6.2.2 6.2.2 异常处理方法异常处理方法 (3)嵌套)嵌套trycatch语句语句 【例题例题 6-4】 两对两对trycatch语句的其中一对语句的其中一对trycatch语句放入另一对语句放入另一对trycatch语句中的语句中的try语句块中,称为嵌套语句块中,称为嵌套trycatch语句语句 。 内部内部try语句限定的范围内的任何一条语句发生了

24、某种异常,如果语句限定的范围内的任何一条语句发生了某种异常,如果没有被内部的没有被内部的catch语句块所捕获,那么就会传到外部的语句块所捕获,那么就会传到外部的catch语句语句块中,由该块中,由该catch语句捕获异常对象。如果捕获成功,就会执行外部语句捕获异常对象。如果捕获成功,就会执行外部的的catch语句块中的内容,否则系统控制输出异常信息,程序执行自语句块中的内容,否则系统控制输出异常信息,程序执行自动终止。动终止。第六章 异常处理Try块与异常处理器A块匹配吗?与异常处理器B块匹配吗?异常处理器A异常处理器BFinally块抛出一个异常信息操作正常是否是否6.2.2 6.2.2

25、异常处理方法异常处理方法v finally语句的使用特点语句的使用特点: 一个一个try语句语句/一个或多个一个或多个 catch语句语句/一个一个 finally 语句语句 可以以这种组合方式来配套使用。其中可以以这种组合方式来配套使用。其中finally 语句不是必须的部分,语句不是必须的部分,可以有,也可以没有。可以有,也可以没有。 try catch(A e) finally /无论无论try语句是否抛出异常,都必须执行的语句。语句是否抛出异常,都必须执行的语句。 第六章 异常处理6.2.2 6.2.2 异常处理方法异常处理方法v finally语句的使用特点:语句的使用特点: 执行过

26、程中,如果执行过程中,如果try语句块中的某个语句发生异常,首先执行语句块中的某个语句发生异常,首先执行 catch语句块的内容,语句块的内容,然后执行然后执行 finally 语句块中的内容。语句块中的内容。 如果如果try语句块中的某个语句未发生异常,直接执行语句块中的某个语句未发生异常,直接执行finally 语句块中的内容。语句块中的内容。 因为无论因为无论try语句是否抛出异常,都必须执行语句是否抛出异常,都必须执行finally 语句块中的内容。因此,该语句语句块中的内容。因此,该语句块中通常放入的内容是:无论块中通常放入的内容是:无论try语句是否抛出异常都必须执行的操作。语句是

27、否抛出异常都必须执行的操作。 例如:打开一个文件或建立一个网络连接,无论是正常操作结束,还是在操作过程例如:打开一个文件或建立一个网络连接,无论是正常操作结束,还是在操作过程中发生了异常,都要关闭文件或断开网络连接。中发生了异常,都要关闭文件或断开网络连接。 因此,把关闭文件语句或断开网络连接语句一定要放入因此,把关闭文件语句或断开网络连接语句一定要放入finally 语句块中。语句块中。 其它放入其它放入finally 语句块内容:由于语句块内容:由于return、continue、break等语句使得控制权转等语句使得控制权转移到移到try语句块之外,在控制权转移到语句块之外,在控制权转移

28、到try语句块外之前,仍然要要执行语句块外之前,仍然要要执行finally 语句块语句块中的内容。中的内容。第六章 异常处理java.lang.Throwable类中与异常相关的方法类中与异常相关的方法 方 法描 述String getMessage()用来得到和列出错误信息的文本String toString()输出类名及与类有关的详细信息String getLocalizedMessage()创建一个错误或者异常的描述符,子类可以用来忽略消息并定制本方法使用的消息void printStackTrace()打印输出从错误点向上的堆栈信息StackTraceElement getStackT

29、race()返回由printStackTrace方法输出的堆栈信息,为编程时访问这些信息提供途径void printStackTrace(PrintStream)打印输出与指定打印流相关的堆栈信息void printStackTrace(PrintWriter)打印输出相关的堆栈信息到指定位置Throwable fillInStackTrace()将该线程的堆栈状态插入到异常对象中 6.2.2 6.2.2 异常处理方法异常处理方法v finally语句的使用特点:语句的使用特点: 由于异常一旦发生,就从发生点直接跳到相应的异常处理器,由于异常一旦发生,就从发生点直接跳到相应的异常处理器,而忽略掉而忽略掉try

温馨提示

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

评论

0/150

提交评论