《java语言程序设计第6章.ppt》由会员分享,可在线阅读,更多相关《java语言程序设计第6章.ppt(15页珍藏版)》请在三一办公上搜索。
1、第6章 常见错误和异常处理,本章主要介绍编程中常见的错误,以及在程序运行过程中出现错误或者异常现象时,Java语言的处理机制和方法,包括异常的概念、异常的处理方法等内容。本章要点6.1 常见错误6.2 异常处理思考与练习6,第6章 常见错误和异常处理,6.2.1 什么是异常处理异常指的是程序运行时出现的非正常情况,又称为差错、违例等。在上一节中介绍的运行错误就是异常的主要现象。当异常现象发生时,会造成程序运行中断、系统死机等问题。Java程序可以用特定语句来处理异常并继续程序执行,而不让程序中断。Java语言提供一个异常处理类Exception类,专门处理程序执行期间的错误。每当Java程序运
2、行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。Java语言异常处理机制有以下一些优点:(1)Java语言通过面向对象的方法进行异常处理,把各种不同的异常事件进行分类,体现了良好的层次性,提供了良好的接口,这种机制对于具有动态运行特性的复杂程序提供了强有力的控制方式。(2)Java语言的异常处理机制使得处理异常的内容和程序本身内容分开,降低了程序的复杂性,增强了程序的可读性。(3)由于把异常事件当成对象来处理,利用类的层次性可以把多个具有相同父类的异常统一处理,也可区分不同的异常分别处理,使用非常灵活。,第6章 常见错
3、误和异常处理,6.2.2 Exception类Java语言的异常类是处理运行时错误的特殊类,每一种异常类对应一种特定的运行错误。所有的Java异常类都是系统类库中的Exception类的子类。Exception类有若干子类,每一个子类代表了一种特定的运行时错误。这些子类有些是系统事先定义好并包含在Java类库中的,称为系统定义的运行异常。系统定义的运行异常通常对应着系统运行错误。由于这种错误可能导致操作系统错误甚至是整个系统的瘫痪,所以需要定义异常类来特别处理。常见的系统定义异常如下:(1)ArithmeticException:数学错误。(2)ArrayIndexOutOfBoundsExc
4、eption:数组下标越界使用。(3)ClassNotFoundException:未找到欲使用的类。(4)FileNotFoundException:未找到指定的文件或目录。,第6章 常见错误和异常处理,6.2.2 Exception类(5)InterruptedException:线程在睡眠、等待或其他原因暂停时被其他线程打断。(6)IOException:输入、输出错误。(7)MalformedURLException:URL格式错误。(8)NullPointerException:引用空的尚无内存空间的对象。(9)SecurityException:安全性错误,如Applet欲读写文件
5、。(10)UnknownHostException:无法确定主机的IP地址。系统定义的异常主要用来处理系统可以预见的较常见的运行错误,对于某个应用程序所特有的运行错误,则需要编程者根据程序的特殊逻辑在应用程序中自行创建自定义的异常类和异常对象。这种用户自定义异常主要用来处理用户程序中特定的逻辑运行错误。,第6章 常见错误和异常处理,6.2.3 异常处理的过程在Java语言中,异常处理最常用的是try-catch-finally语句结构,以及throw和throws关键字。下面我们将一一进行介绍。1try-catch-finally通过使用try-catch-finally语句来捕获一个或多个异
6、常,基本格式为:try 语句体catch(异常错误类型 变量名)语句体finally 语句体,第6章 常见错误和异常处理,6.2.3 异常处理的过程其中,catch语句可以有一个或多个,而finally语句可以没有,但是,至少要有一个catch语句或finally语句。try语句中的语句体是程序中有可能会产生一个或多个异常的语句。catch语句的参数类似于方法的参数,其包括一个异常类型和一个异常对象。异常类型必须为Exception类的子类,它指明了catch语句所处理的异常类型。在程序运行时,当try语句体中产生异常时,系统会通过catch语句捕获这个异常,然后执行catch语句中的语句体对
7、该异常进行处理。catch语句可以有多个,分别处理不同类的异常。Java运行时系统从上到下分别对每个catch语句处理的异常类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的异常类型与生成的异常对象的类型完全一致或者是它的父类。因此,catch语句的排列顺序应该是从特殊到一般。,第6章 常见错误和异常处理,6.2.3 异常处理的过程也可以用一个catch语句处理多个异常类型,这时它的异常类型参数应该是这多个异常类型的父类,程序设计中要根据具体的情况来选择catch语句的异常处理类型。在捕捉异常时,还可以使用finally语句。在try-catch之后接上f
8、inally语句,表示执行try-catch描述后,无论有无异常,最后必须执行finally语句中的语句体。,第6章 常见错误和异常处理,6.2.3 异常处理的过程2关键字throws和throw在有些情况下,程序并不需要使用try-catch-finally处理它所生成的异常,而是由调用它的方法来处理这些异常,这时就要用到throws子句,它包含在方法的声明中。其格式如下:返回类型 方法名(参数)throws 异常类名 语句体其中,异常类名可以是多个,但需要用逗号隔开。,第6章 常见错误和异常处理,6.2.3 异常处理的过程2关键字throws和throw一般这种抛出异常的语句应该被定义为在
9、满足一定条件时执行,例如:把throw语句放在if语句的判断分支中,只有当if条件得到满足,即用户定义的逻辑错误发生时才执行。含有throw语句的方法,应该在方法头定义中增加如下部分:throws 异常类名这样做主要是为了通知所有欲调用此方法的方法。由于该方法包含throw语句,所以要准备接受和处理它在运行过程中可能会抛出的异常。如果方法中的throw语句不止一个,定义方法时的异常类名也不止一个,应该包含所有可能产生的异常。,第6章 常见错误和异常处理,6.2.4 多异常的处理catch语句用来接收try语句体中可能产生的异常,一个catch语句通常会用同种方式来处理它所接收到的所有异常,但是
10、实际上一个try语句体可能产生多种不同的异常,如果希望能采取不同的方法来处理这些异常,就需要使用多异常处理机制。多异常处理是通过在一个try语句后面定义若干个catch语句来实现的,每个catch语句体用来接收和处理一种特定的异常对象。当try语句体抛出一个异常时,程序的流程首先转向第一个catch语句,并审查当前异常对象可否为这个catch语句所接收。能接收是指异常对象与catch的参数类型相匹配,也就是说,异常对象与参数属于相同的异常类、异常对象属于参数异常类的子类或者异常对象实现了参数所定义的接口。如果try语句体产生的异常对象被第一个catch语句所接收,则程序的流程将直接跳转到这个c
11、atch语句的语句体中,语句体执行完毕后就退出当前方法,try语句体中尚未执行的语句和其他的catch语句将被忽略。,第6章 常见错误和异常处理,6.2.4 多异常的处理如果所有的catch语句都不能与当前的异常对象匹配,则说明当前方法不能处理这个异常对象,程序流程将返回到调用该方法的上层方法。如果这个上层方法中定义了与所产生的异常对象相匹配的catch语句,流程就跳转到这个catch语句中,否则将继续回溯更上层的方法。如果所有的方法中都找不到合适的catch语句,则由Java运行系统来处理这个异常对象。此时通常会中止程序的执行,退出虚拟机返回操作系统,并在标准输出上打印相关的异常信息。如果t
12、ry语句体中所有语句的执行都没有引发异常,则所有的catch语句体都会被忽略而不予执行。catch语句体中的语句应根据异常的不同而执行不同的操作,比较通用的操作是打印异常和错误的相关信息,包括异常名称、产生异常的方法名等。由于异常对象与catch语句的匹配是按照catch语句的先后排列顺序进行的,所以在处理多异常时应注意认真设计各catch语句的排列顺序。一般来说,将处理较具体和较常见的异常的catch语句应放在前面,而可以与多种异常相匹配的catch语句应放在较后的位置。此外,不能将子类异常的catch语句放在父类的后面,否则在编译时会产生错误。,第6章 常见错误和异常处理,6.2.5 自定
13、义异常处理Java类库中定义的异常主要用来处理系统可以预见的比较常见的运行错误。如果某个应用程序有特殊的要求,则可能出现系统不能识别的运行错误,这时就需要用户自己创建异常和异常类,使系统能够识别这种错误并进行处理,增强用户程序的健壮性和容错性,从而使系统更加稳定。用户自定义的异常类一般都是Exception类的直接或间接子类。创建自定义异常的基本步骤如下。(1)定义一个新的异常类,其必须继承Exception类、Exception类的子类或用户自定义的其他异常类。定义的格式如下:class 自定义异常类名 extends 父异常类名 语句体,第6章 常见错误和异常处理,6.2.5 自定义异常处
14、理(2)为新的异常类定义属性和方法,或重载父类的属性和方法,使之能够体现出程序中出现这种异常的信息。例如:public class NumberRangeException extends Exception public NumberRangeException()super();public NumberRangeException(String s)super(s);,第6章 常见错误和异常处理,6.2.5 自定义异常处理上面的程序定义了一个名为NumberRangeException的异常类,它是Exception类的子类。该类具有两个构造方法,第一个构造方法使用super();语句直
15、接调用父类的没有参数的构造方法,第二个构造方法使用super(s);语句直接调用父类参数为字符串类型的构造方法。当然,我们也可以自己编写构造方法的具体内容,以便完成更复杂的操作。(3)抛出用户自定义的异常。用户自定义异常不可能依靠系统自动抛出,而必须通过throw语句抛出异常,通常是通过条件判断确定是否抛出这个异常类的新对象。抛出用户自定义异常格式如下:返回类型 方法名(参数1,参数2,)throw 自定义异常类 if(条件判断)throw(new 自定义异常类名(this);,第6章 常见错误和异常处理,6.2.5 自定义异常处理上面的程序定义了一个名为NumberRangeException的异常类,它是Exception类的子类。该类具有两个构造方法,第一个构造方法使用super();语句直接调用父类的没有参数的构造方法,第二个构造方法使用super(s);语句直接调用父类参数为字符串类型的构造方法。当然,我们也可以自己编写构造方法的具体内容,以便完成更复杂的操作。(3)抛出用户自定义的异常。用户自定义异常不可能依靠系统自动抛出,而必须通过throw语句抛出异常,通常是通过条件判断确定是否抛出这个异常类的新对象。抛出用户自定义异常格式如下:返回类型 方法名(参数1,参数2,)throw 自定义异常类 if(条件判断)throw(new 自定义异常类名(this);,
链接地址:https://www.31ppt.com/p-6510226.html