版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5章章 异常异常 5.1 编程中的错误编程中的错误 5.2异常与异常类异常与异常类 5.3异常的处理异常的处理 5.4 异常地抛出异常地抛出 5.5应用举例应用举例 5.1 编程中的错误编程中的错误 程序中出现的错误必须要处理,否则程序会错误退出或带来程序中出现的错误必须要处理,否则程序会错误退出或带来 错误的结果和状态,造成越来越多的异常现象。错误的结果和状态,造成越来越多的异常现象。 根据错误的性质和特点,根据错误的性质和特点,般可把错误分为编译错误和运行般可把错误分为编译错误和运行 错误两种。错误两种。 编译错误是由于所编码的程序存在语法问题,未能通过内源编译错误是由于所编码的程序存
2、在语法问题,未能通过内源 代码到目标码的编译过程而产生的,它是由语言的编译系统代码到目标码的编译过程而产生的,它是由语言的编译系统 负责检测和报告。负责检测和报告。 下一页返回 5.1 编程中的错误编程中的错误 每种计算机高级语言都有自己的语法规范,编译系统就根据每种计算机高级语言都有自己的语法规范,编译系统就根据 这个规范来检查编程人员所书写的源代码(程序)是否符合这个规范来检查编程人员所书写的源代码(程序)是否符合 既定的标准。有的高级语言的语法规定得比较严格,有的语既定的标准。有的高级语言的语法规定得比较严格,有的语 言则给编程人员很大的自由度,如言则给编程人员很大的自由度,如C语言,程
3、序可以写得很语言,程序可以写得很 灵活,使编程者可充分发挥他们的核心和能力。灵活,使编程者可充分发挥他们的核心和能力。Java语言是语言是 定位于网络计算的安全性要求较高的语言,它的语法规范设定位于网络计算的安全性要求较高的语言,它的语法规范设 计得比较全面,相对于计得比较全面,相对于C语言增加了不少规定。例如,数组语言增加了不少规定。例如,数组 元素下标越界检查、检查对未开辟空间对象的使用等。由于元素下标越界检查、检查对未开辟空间对象的使用等。由于 更多的检查工作由系统自动完成,可以减少编程者的设计负更多的检查工作由系统自动完成,可以减少编程者的设计负 担和程序中的隐含错误,提高初学者编程的
4、成功率。担和程序中的隐含错误,提高初学者编程的成功率。 上一页 下一页返回 5.1 编程中的错误编程中的错误 大部分编译错误是由于对语法不熟悉或拼写失误等引起的,大部分编译错误是由于对语法不熟悉或拼写失误等引起的, 例如在例如在Java语言中规定:需在每个句子的末尾使用分号,标语言中规定:需在每个句子的末尾使用分号,标 识符区分大小写,如果不注意这些细杰,就会引发编译错误。识符区分大小写,如果不注意这些细杰,就会引发编译错误。 由于编译系统会给出每个编译错误的位置和相关的错误信息,由于编译系统会给出每个编译错误的位置和相关的错误信息, 所以修改编译错误相对较简单;但同时由于编译系统判定错所以修
5、改编译错误相对较简单;但同时由于编译系统判定错 误比较机械,再参考他所指出的错误地点和信息时应灵活的误比较机械,再参考他所指出的错误地点和信息时应灵活的 同时参照上下文其他语句,将程序作为一个整体来检查。同时参照上下文其他语句,将程序作为一个整体来检查。 没有编译错误是一个程序能正常运行的基本条件,只有所有没有编译错误是一个程序能正常运行的基本条件,只有所有 的编译错误都改正了,源代码才可以被成功的编译成目标代的编译错误都改正了,源代码才可以被成功的编译成目标代 码或字节代码。码或字节代码。 上一页 下一页返回 5.1 编程中的错误编程中的错误 一个没有编译错误的可执行或解释的程序,距离完全正
6、确的一个没有编译错误的可执行或解释的程序,距离完全正确的 程序通常还有一段距离,这是因为排除了编译错误,程序中程序通常还有一段距离,这是因为排除了编译错误,程序中 可能还存在着运行错误。可能还存在着运行错误。 运行错误是在程序的运行过程中产生的错误。根据性质不同,运行错误是在程序的运行过程中产生的错误。根据性质不同, 运行错误还可分为系统运行错误和逻辑运行错误。运行错误还可分为系统运行错误和逻辑运行错误。 上一页 下一页返回 5.1 编程中的错误编程中的错误 系统错误是指程序在执行过程中引发了操作系统的问题。应系统错误是指程序在执行过程中引发了操作系统的问题。应 用程序是工作在计算机的操作系统
7、平台上的,如果应用程序用程序是工作在计算机的操作系统平台上的,如果应用程序 运行时所产生的运行错误危及操作系统,对操作系统产生损运行时所产生的运行错误危及操作系统,对操作系统产生损 害,就有可能造成整个计算机的瘫痪,例如死机、死循环等。害,就有可能造成整个计算机的瘫痪,例如死机、死循环等。 所以不排除系统运行错误,程序就不能正常地工作。系统运所以不排除系统运行错误,程序就不能正常地工作。系统运 行错误通常比较隐秘,排除时应根据错误的现象,结合源程行错误通常比较隐秘,排除时应根据错误的现象,结合源程 序仔细判断。例如,出现死循环,就应该检测源程序中的循序仔细判断。例如,出现死循环,就应该检测源程
8、序中的循 环语句及其中止条件;出现死机,就应该检查程序中的内存环语句及其中止条件;出现死机,就应该检查程序中的内存 分配处理语句等。分配处理语句等。 上一页 下一页返回 5.1 编程中的错误编程中的错误 排除了系统运行错误,程序可以顺利执行了,却仍然不能代排除了系统运行错误,程序可以顺利执行了,却仍然不能代 表它已经毫无问题了。因为程序中还有可能存在着逻辑运行表它已经毫无问题了。因为程序中还有可能存在着逻辑运行 错误。逻辑运行错误是指程序不能实现编程人员的设计意图错误。逻辑运行错误是指程序不能实现编程人员的设计意图 和设计功能而产生的错误,例如排序时不能正确处理数组头和设计功能而产生的错误,例
9、如排序时不能正确处理数组头 后的元素等。有些逻辑运算错误是由于算法考虑不周引起的,后的元素等。有些逻辑运算错误是由于算法考虑不周引起的, 也有些则来自编码过程中的疏忽。也有些则来自编码过程中的疏忽。 排除运行错误时,一个非常有效和常用的手段是使用开发环排除运行错误时,一个非常有效和常用的手段是使用开发环 境所提供的单步运行机制和设置断点功能来分解程序运行过境所提供的单步运行机制和设置断点功能来分解程序运行过 程,使之在人为的控制下边调试边运行。在调试过程中,调程,使之在人为的控制下边调试边运行。在调试过程中,调 试者可以随时检查变量中保存的中间量,设置临时运行环境,试者可以随时检查变量中保存的
10、中间量,设置临时运行环境, 一步一步地检查程序的执行过程,从而挖出隐藏的错误。一步一步地检查程序的执行过程,从而挖出隐藏的错误。 上一页返回 5.2异常与异常类异常与异常类 异常就是在程序的运行过程中所发生的异常事件(不正常现异常就是在程序的运行过程中所发生的异常事件(不正常现 象),它中断指令的正常执行。在象),它中断指令的正常执行。在Java程序的执行过程中,程序的执行过程中, 如果出现了异常事件,就会生成一个异常对象,故又称为特如果出现了异常事件,就会生成一个异常对象,故又称为特 殊的运行错误对象。很多类型的错误也都会导致异常的产生,殊的运行错误对象。很多类型的错误也都会导致异常的产生,
11、 如需要打开的文件不存在、内存不够、数据访问超界、严重如需要打开的文件不存在、内存不够、数据访问超界、严重 者导致硬盘崩溃等,都会影响程序的正常执行。者导致硬盘崩溃等,都会影响程序的正常执行。 在网络环境中运行的在网络环境中运行的Java程序,安全是首先考虑的重要元素程序,安全是首先考虑的重要元素 之一。为了能够及时有效地处理程序中的远行错误,之一。为了能够及时有效地处理程序中的远行错误,Java中中 通过引入异常和异常类来处理。作为面向对象的语言,异常通过引入异常和异常类来处理。作为面向对象的语言,异常 与其他语言要素一样,是面向对象规范的一部分,是异常类与其他语言要素一样,是面向对象规范的
12、一部分,是异常类 的对象。的对象。 下一页返回 5.2异常与异常类异常与异常类 Java中定义了很多异常类,每个异常类都代表了一种运行错中定义了很多异常类,每个异常类都代表了一种运行错 误,类中包含了该运行错误的信息和处理错误的方法等内容。误,类中包含了该运行错误的信息和处理错误的方法等内容。 每当每当Java程序运行过程中发生一个可识别的运行错误时,即程序运行过程中发生一个可识别的运行错误时,即 该错误有一个异常与之相对应时,系统都会产生一个相应的该错误有一个异常与之相对应时,系统都会产生一个相应的 该异常类的对象,即产生一个异常。一旦一个异常对象产生该异常类的对象,即产生一个异常。一旦一个
13、异常对象产生 了,系统中就一定有相应的机制来处理它,确保不会产生死了,系统中就一定有相应的机制来处理它,确保不会产生死 机、死循环或其他对操作系统的损害,从而保证了整个程序机、死循环或其他对操作系统的损害,从而保证了整个程序 运行的安全性。这就是运行的安全性。这就是java的异常处理机制。的异常处理机制。 如在例如在例5-1中,当我们在一个文件上建立文件输入流时,如中,当我们在一个文件上建立文件输入流时,如 果这个文件并不存在,异常就会生成,另外,在从文件中读果这个文件并不存在,异常就会生成,另外,在从文件中读 取数据时,也可能发生取数据时,也可能发生IO异常。异常。 上一页 下一页返回 5.
14、2异常与异常类异常与异常类 例例5-1 文件操作异常。文件操作异常。 Import java .io.*; Class Exception Demol Public static void main ( String args ) File Input Stream Fis=nes File Input Stream (“text”) ; Int b; While ( ( b=fis . read () ) ! = -1 ) System .out .print (b) ; Fis .close (); 上一页 下一页返回 5.2异常与异常类异常与异常类 当我们编译这个程序时,屏幕上会输出下面
15、的信息:当我们编译这个程序时,屏幕上会输出下面的信息: ExceptionDemo1.Java:6: Exception java. io. File Not Found Exception must be caught,or it must be declared in the throws clause of this method File Input Stream fis=new File Input Stream(“text”); ExceptionDemol.java:8: Exception java .io .IOException must be caught ,or it
16、must be declared in the throws clause of this method. While(b=fis .read()!=-1) 上一页 下一页返回 5.2异常与异常类异常与异常类 2 errors 在在Java程序的执行过程中,异常对象可能是由正在运行的方程序的执行过程中,异常对象可能是由正在运行的方 法生成,也可能由法生成,也可能由Java虚拟机生成,其中包含一些信息指明虚拟机生成,其中包含一些信息指明 异常事件的类型以及当异常发生时程序的运行状态等。生成异常事件的类型以及当异常发生时程序的运行状态等。生成 的异常对象将传递给的异常对象将传递给Java运行时系统
17、,这一异常的产生和提运行时系统,这一异常的产生和提 交过程称为抛出(交过程称为抛出(throw)异常。)异常。 当当Java运行时系统得到一个异常对象时,它将会寻找处理这运行时系统得到一个异常对象时,它将会寻找处理这 一异常的代码。寻找的过程从生成异常对象的代码块开始,一异常的代码。寻找的过程从生成异常对象的代码块开始, 沿着方法的调用栈逐层回溯,直到找到一个方法能够处理这沿着方法的调用栈逐层回溯,直到找到一个方法能够处理这 种类型的异常为止。然后运行时系统把当前异常对象交给这种类型的异常为止。然后运行时系统把当前异常对象交给这 个方法进行处理。这一过成称为捕获(个方法进行处理。这一过成称为捕
18、获(catch)异常。)异常。 如果如果Java运行时系统找不到可以捕获异常的方法,则运行时运行时系统找不到可以捕获异常的方法,则运行时 系统将终止,相应的系统将终止,相应的Java程序也将退出。例程序也将退出。例5-2中出现的即中出现的即 为这种情况。为这种情况。 上一页 下一页返回 5.2异常与异常类异常与异常类 例例5-2 当当0作为除数时,会发生除零溢出的异常事件,使作为除数时,会发生除零溢出的异常事件,使 程序无法继续运行。程序无法继续运行。 Class ExceptionDem02 Public static void main(String args ) Int a(); 我们编
19、译这个程序得到其字节码文件,然后运行它,屏幕上我们编译这个程序得到其字节码文件,然后运行它,屏幕上 的显示如下:的显示如下: javaLang.ArthmeticException:/by zero at ExceptionDemo2main(ExceptionDemo2.Java: 4) 上一页 下一页返回 5.2异常与异常类异常与异常类 在上面的两个例子中,我们都遇到了异常。屏幕上所显示的在上面的两个例子中,我们都遇到了异常。屏幕上所显示的 信息:信息: javaio File Not Found Exception ,java .io. IOException 以及以及 javaLang
20、 Arlthmetic Exception 分别指明了异常的类型。同时我们也可以看到,对于一些异分别指明了异常的类型。同时我们也可以看到,对于一些异 常,在程序中必须对它进行处理,否则编译程序会指出错误常,在程序中必须对它进行处理,否则编译程序会指出错误 (如例(如例5-1)。但对另一些异常,在程序中可以不做处理,)。但对另一些异常,在程序中可以不做处理, 而直接由运行时系统来处理(如例而直接由运行时系统来处理(如例5-2)。)。 使用异常处理程序出错有以下两个原因:一是将错误处理程使用异常处理程序出错有以下两个原因:一是将错误处理程 序与正常程序流分开,增加程序的可读性和可维护性;二是序与正
21、常程序流分开,增加程序的可读性和可维护性;二是 可容易的指出异常在何处处理。可容易的指出异常在何处处理。 上一页 下一页返回 5.2异常与异常类异常与异常类 在在java类库的每个包中都定义了异常类,所有这些类都是类类库的每个包中都定义了异常类,所有这些类都是类 Throwable的子类。的子类。Throwable类属于类库类属于类库java.lang 包中的一个类,在程序中不必使用包中的一个类,在程序中不必使用import语句引入即可食语句引入即可食 用。用。Throwable类派生了两个子类:类派生了两个子类:Exception和和Error。 其中其中Error类由系统保留,而类由系统保
22、留,而Exception类则供应用程序使类则供应用程序使 用。用。Java作为面向对象设计语言,它定义了很多标准的异常作为面向对象设计语言,它定义了很多标准的异常 处理类,采用捕获处理类,采用捕获-抛出(抛出(catch-throw)方式,捕获并处)方式,捕获并处 理异常。理异常。 上一页 下一页返回 5.2异常与异常类异常与异常类 Error类的子类有后缀类的子类有后缀Error,它们用于指示异常系统条件。,它们用于指示异常系统条件。 例如例如Out Of Memory Error表示虚拟机内存超界,内存表示虚拟机内存超界,内存 单元收集程序无法获得更多的内存:单元收集程序无法获得更多的内存
23、:Stack Over Flow Error表示翻译器中堆栈溢出。这些表示翻译器中堆栈溢出。这些Error类的子类包括动类的子类包括动 态链接失败、虚拟机错误等,通常态链接失败、虚拟机错误等,通常Java程序不捕获这些异常,程序不捕获这些异常, 也不会抛出这种异常。一般来说,这些异常是不可修复的,也不会抛出这种异常。一般来说,这些异常是不可修复的, 不易处理。不易处理。 Exception类的子类一般是可以修复的。例如类的子类一般是可以修复的。例如EOF Exception表示打开的文件不再有可读数据;表示打开的文件不再有可读数据;File Nor Found Exception表示打开的文件
24、在文件系统中不存在。表示打开的文件在文件系统中不存在。 这一子类是这一子类是Java程序中所大量处理的异常。并且同其他的类程序中所大量处理的异常。并且同其他的类 一样,一样,Exception类有自己的方法和属性。他的构造函数有类有自己的方法和属性。他的构造函数有 两个:两个: 上一页 下一页返回 5.2异常与异常类异常与异常类 格式格式 public Exception (); Public Exception (String s); 说明说明 第二个接受字符串参数传入的信息,通常是对该异常第二个接受字符串参数传入的信息,通常是对该异常 所对应错误的描述。所对应错误的描述。 Exceptio
25、n类从父类类从父类Throwable那里还继承了若干方法,那里还继承了若干方法, 其中常用的有:其中常用的有: 格式格式 public String to String();(); 说明说明 显示异常信息以及显示异常信息以及getMessage()返回信息的简短返回信息的简短 描述的字符串。描述的字符串。 格式格式 public void print StackTrace(); 说明说明 打印异常发生处堆栈跟踪信息,包括异常的类名、方打印异常发生处堆栈跟踪信息,包括异常的类名、方 法名及所在程序的行数,没有返回值,实际上它的功能是完法名及所在程序的行数,没有返回值,实际上它的功能是完 成一个打
26、印操作,在当前的标准输出(一般就是屏幕)上打成一个打印操作,在当前的标准输出(一般就是屏幕)上打 印输出当前异常对象的堆栈使用轨迹,也即程序先后调用执印输出当前异常对象的堆栈使用轨迹,也即程序先后调用执 行了哪些对象或类的那些方法,使得运算过程中产生了这个行了哪些对象或类的那些方法,使得运算过程中产生了这个 异常对象。异常对象。 上一页 下一页返回 5.2异常与异常类异常与异常类 格式格式 public Sting GetMessage (); 说明说明 获得与异常和错误相关的更详细的错误信息,但非每获得与异常和错误相关的更详细的错误信息,但非每 个异常都有详细信息。如果没有详细信息,该方法调
27、用后返个异常都有详细信息。如果没有详细信息,该方法调用后返 回空值。回空值。 Exception类有若干子类,每一个子类代表了一种特定的运类有若干子类,每一个子类代表了一种特定的运 行时异常。其中有些是系统实现定义好并包含在行时异常。其中有些是系统实现定义好并包含在Java类库中类库中 的,称为系统定义的运行异常。的,称为系统定义的运行异常。 系统定义的运行异常通常对应着系统运行错误。由于这种错系统定义的运行异常通常对应着系统运行错误。由于这种错 误可能导致操作系统错误甚至误可能导致操作系统错误甚至ishi整个系统的瘫痪,如例整个系统的瘫痪,如例5- 1所涉及到的所涉及到的File Not F
28、ound Exception和和IO Exception。对于这类异常来说,如果程序不进行处理,可。对于这类异常来说,如果程序不进行处理,可 能会带来意想不到的结果,所以定义异常类来特别处理,下能会带来意想不到的结果,所以定义异常类来特别处理,下 面列出若干常见的系统定义运行异常:面列出若干常见的系统定义运行异常: 上一页 下一页返回 5.2异常与异常类异常与异常类 Class Not Found Exception:未找到欲装载使用的类异未找到欲装载使用的类异 常。常。 ArrayIndexOnOfBoundsException:数组越界异常,:数组越界异常, 即小雨或超过数组界限使用。即小
29、雨或超过数组界限使用。 File Not Found Exception:引用空的尚无内存空间的:引用空的尚无内存空间的 对象异常。对象异常。 Arithmetic Exception:零件为除数等算术异常。:零件为除数等算术异常。 Intcrrupted Exception:线程在睡眠、等待或其他原因:线程在睡眠、等待或其他原因 暂停时被其他线程扫断。暂停时被其他线程扫断。 Un known Host Exception:无法确定主机的:无法确定主机的IP地址异地址异 常。常。 Security Exception:安全性异常,如:安全性异常,如Applet欲读写文欲读写文 件。件。 Mal
30、forned URL Exception:URL格式异常。格式异常。 String Index Out Of Bounds Exception:访问:访问 String或或String Buffer字符时,索引小于零或超过字符字符时,索引小于零或超过字符 串长度。串长度。 上一页 下一页返回 5.2异常与异常类异常与异常类 例例5-3 测试异常程序。测试异常程序。 Public class Exception Test public static void main(String args) For(int i-0;i4;i+) Int k; Try Switch(i) Case(); /di
31、vided by zero 上一页 下一页返回 5.2异常与异常类异常与异常类 Int zero=0; K=911/zero; Break; Case 1; /null pointer Int b=null; K=b0; Break; Case 2; /array index out of bound Int c=new int2; K=c9; Break; 上一页 下一页返回 5.2异常与异常类异常与异常类 Case 3; /string index out of bound Char ch-“abc”.charAt(99); Break; catch(Exception e) 上一页 下一
32、页返回 5.2异常与异常类异常与异常类 运行测试程序的输出结果如下:运行测试程序的输出结果如下: Test case #0 Java . lang . Arithmetic Exception :/by zero Test case #1 Java . lang . Null Pointer Exception; Test case #2 Java . lang . Array Index Out Of Bounes Exception Test case #3 上一页 下一页返回 5.2异常与异常类异常与异常类 Java . lang . String Index Out Of Bounds
33、 Exception :Stingindes out of range :99 由于定义了相应的异常,由于定义了相应的异常,Java程序即使产生一些致命的错误,程序即使产生一些致命的错误, 如引用空对象的等,系统也会自动产生一个对应的异常对象如引用空对象的等,系统也会自动产生一个对应的异常对象 来处理和控制这个错误,避免其蔓延或产生更大的问题。来处理和控制这个错误,避免其蔓延或产生更大的问题。 对于某个应用所特有的运行错误,则需要编程人员根据程序对于某个应用所特有的运行错误,则需要编程人员根据程序 的特殊逻辑在用户程序里自己创建用户自定义的异常类和异的特殊逻辑在用户程序里自己创建用户自定义的异
34、常类和异 常对象。这种用户自定义异常主要用来处理用户程序中特定常对象。这种用户自定义异常主要用来处理用户程序中特定 的逻辑运行错误。的逻辑运行错误。 定义一个定义一个Employee类的构造函数:类的构造函数: 上一页 下一页返回 5.2异常与异常类异常与异常类 Employee(String name,double initSal) /有有 两个参数的构造函数,利用这两个参数初始化两个参数的构造函数,利用这两个参数初始化 /雇员姓名、工资并初始化雇雇员姓名、工资并初始化雇 员编号员编号 This (); m_EmpName=new String (name); If (initSalm,Mi
35、nSalary) System . exit(0); M_EmpSalary=initSal; 上一页 下一页返回 5.2异常与异常类异常与异常类 在这个方法里,一旦给出的雇员工资初值不符合最低工资的在这个方法里,一旦给出的雇员工资初值不符合最低工资的 规定,则直接退出整个程序的运行。这样处理虽然保证了程规定,则直接退出整个程序的运行。这样处理虽然保证了程 序的逻辑正确性,但却没有给出足够的错误提示信息,如果序的逻辑正确性,但却没有给出足够的错误提示信息,如果 程序里还有其他类似的处理,那么当产生错误退出运行时,程序里还有其他类似的处理,那么当产生错误退出运行时, 用户将无法得知到底是什么错误
36、导致了这次推出,对于程序用户将无法得知到底是什么错误导致了这次推出,对于程序 的调试和运行都很不方便。为了解决这个问题,我们可以定的调试和运行都很不方便。为了解决这个问题,我们可以定 义一个用户程序异常义一个用户程序异常IIIegalSalaryException,专门处,专门处 理上述理上述“发给雇员的工资低于系统要求的最低工资发给雇员的工资低于系统要求的最低工资”的逻辑的逻辑 错误。错误。 上一页 下一页返回 5.2异常与异常类异常与异常类 Public class IllegatSalaryException Extends Exception /自定义的系统类自定义的系统类Except
37、ion的子类的子类 Private Emplouee m_ConcernedEmp: /产产 生当前错误的生当前错误的Employee对象的引用对象的引用 Pribate double m_IllegalSalary; /产生当产生当 前错误的非法的工资数额前错误的非法的工资数额 IllegalSalaryException() Super(“不合法的起薪:低于最低工资限额不合法的起薪:低于最低工资限额”);); /调用父类调用父类Exception的构造函数的构造函数 上一页 下一页返回 5.2异常与异常类异常与异常类 IllegalSalaryException(Employee emp,
38、double iSal) /构造函数构造函数 This(); M_ConcernedEmp=emp; /初始化两个属性初始化两个属性 M_illegalSalary=iSal; Public String to String() /重载父类的方法,重载父类的方法, 给出详细的错误信息给出详细的错误信息 String s; 上一页 下一页返回 5.2异常与异常类异常与异常类 If(m_ConcernedEmp!=null) S=”为雇员提供非法工资;雇员号为雇员提供非法工资;雇员号 _”+m_ComcernedEmp .getEmpNo() +”非法工资数额非法工资数额_”+m+IllegalS
39、alary+”合合 法的最低工资数额法的最低工资数额_” +Employee .getMinSalary(); Else S=”给出的工资初始值不合理,不能创建给出的工资初始值不合理,不能创建 Employee对象对象”; Return s; 上一页 下一页返回 5.2异常与异常类异常与异常类 用户自定义异常用来处理程序中可能产生的逻辑错误,使得用户自定义异常用来处理程序中可能产生的逻辑错误,使得 这种错误能够被系统及时识别并处理,而不致造成更大的影这种错误能够被系统及时识别并处理,而不致造成更大的影 响,从而使用户程序更为稳定,有更灵活的容错性能,并使响,从而使用户程序更为稳定,有更灵活的容
40、错性能,并使 整个系统更加安全。整个系统更加安全。 创建用户自定义异常时,一般需要完成如下的工作:创建用户自定义异常时,一般需要完成如下的工作: (1)声明一个新的异常类,使之以)声明一个新的异常类,使之以Exception类或其他某类或其他某 个已经存在的系统异常类或用户异常类为父类;个已经存在的系统异常类或用户异常类为父类; (2)为新的异常类定义属性和方法,或重载父类的属性和)为新的异常类定义属性和方法,或重载父类的属性和 方法,使这些属性和方法能够体现该类所对应的错误的信息。方法,使这些属性和方法能够体现该类所对应的错误的信息。 只有定义了异常类,系统才能够识别特定的运行错误,才能只有
41、定义了异常类,系统才能够识别特定的运行错误,才能 够及时地控制和处理运行错误;所以定义足够多的异常类是够及时地控制和处理运行错误;所以定义足够多的异常类是 构建一个稳定完善的应用系统的重要基础之一。构建一个稳定完善的应用系统的重要基础之一。 上一页返回 5.3异常的处理异常的处理 异常的处理是通过异常的处理是通过try-catch-finally语句实现的。其语法语句实现的。其语法 为:为: 格式格式 try 正常程序段;正常程序段; catch(Execption Name 1 e) /catch (异常类(异常类 1 异常变量)异常变量) 与异常类与异常类1有关的处理程序段;有关的处理程序
42、段; catch(Execption Name 2 e) 与异常类与异常类2有关的处理程序段;有关的处理程序段; 下一页返回 5.3异常的处理异常的处理 catch(Exception Namen e) 与异常类与异常类n有关的处理程序段;有关的处理程序段; finally 推出异常程序段;推出异常程序段; 说明说明 在在try-catch-finally语句结构中,语句结构中,catch语句和语句和 finally语句是可选的,但是至少要有一个语句是可选的,但是至少要有一个catch语句或语句或 finally语句。语句。 1、try 捕获异常的第一步是用捕获异常的第一步是用try选定捕获异
43、常的范围,由选定捕获异常的范围,由 try所限定的代码块中的语句,在执行过程中可能会生成异所限定的代码块中的语句,在执行过程中可能会生成异 常对象)(抛出异常)。这个常对象)(抛出异常)。这个try语句块用来启动语句块用来启动java的异的异 常处理机制,可能抛出异常的语句,包括常处理机制,可能抛出异常的语句,包括throw语句、调用语句、调用 可能抛出异常方法的调用语句,都应该包含在这个可能抛出异常方法的调用语句,都应该包含在这个try语句语句 块中。块中。 上一页 下一页返回 5.3异常的处理异常的处理 2、catch捕捉异常捕捉异常 当一个异常被抛出时,应该有专门的语句来接收这个被抛出当
44、一个异常被抛出时,应该有专门的语句来接收这个被抛出 的异常对象,这个过程被称为捕捉异常。当一个异常类的对的异常对象,这个过程被称为捕捉异常。当一个异常类的对 象被捕捉获接收后,用户程序就会发生流程的跳转,系统中象被捕捉获接收后,用户程序就会发生流程的跳转,系统中 止当前的流程而跳转至专门的异常处理语句块,或直接跳出止当前的流程而跳转至专门的异常处理语句块,或直接跳出 当前程序和当前程序和Java虚拟机回到操作系统。虚拟机回到操作系统。Java语言规定,每语言规定,每 个个catch语句块都应该与一个语句块都应该与一个try语句块相对应,每个语句块相对应,每个try代代 码块也必须伴随一个或多个
45、码块也必须伴随一个或多个catch语句,用于处理语句,用于处理try代码块代码块 中所生成的异常事件。中所生成的异常事件。Catch语句只需要一个形式参数,参语句只需要一个形式参数,参 数类型指明它能够捕获的异常类型,这个类必须是数类型指明它能够捕获的异常类型,这个类必须是 Throwable的子类,运行时系统通过参数值把被抛弃的异的子类,运行时系统通过参数值把被抛弃的异 常对象传递给常对象传递给catch块。其格式如下:块。其格式如下: 上一页 下一页返回 5.3异常的处理异常的处理 格式格式 catch(异常类名(异常类名 异常形式参数名)异常形式参数名) 与异常类有关的处理语句组;与异常
46、类有关的处理语句组; 因此,在因此,在Java程序里,异常对象是依靠以程序里,异常对象是依靠以catch语句为标志语句为标志 的异常处理语句块来捕捉和处理的。异常处理语句块又称为的异常处理语句块来捕捉和处理的。异常处理语句块又称为 catch语句块。在语句块。在catch块中是对异常对象进行处理的代码,块中是对异常对象进行处理的代码, 预防为其他对象一样,可以访问一个异常对象的变量或调用预防为其他对象一样,可以访问一个异常对象的变量或调用 它的方法。它的方法。Get Message()是类是类Throw able所提供的方所提供的方 法,用来得到有关异常事件的信息,类法,用来得到有关异常事件的
47、信息,类Throw able还提供还提供 了方法了方法print Stack Trace()用来跟踪异常事件发生时执用来跟踪异常事件发生时执 行堆栈的内容。行堆栈的内容。 上一页 下一页返回 5.3异常的处理异常的处理 例例 5-4 捕捉并处理异常。捕捉并处理异常。 Import java . io .*; Public class TryTest Public TryTest() Try Int a=new int2; a4=3; System . out .printIn (“After handling exception return here?”); catch (Index Out
48、 Of Bounds Exception e) System . err . printIn (“exception msg:”+e. gerMessage() ); System . er . printIn (“exception string:”+e. toString() ); e.printStackTrace(); finally 上一页 下一页返回 5.3异常的处理异常的处理 System .out .printIn(“-“); System . out .printIn(“finally”); System . out .printIn(“No exception?”); Pu
49、blic static void main (String args) New TryTest(); 上一页 下一页返回 5.3异常的处理异常的处理 例例5-4设计了一个数组超界异常。用设计了一个数组超界异常。用catch语句捕获异常,语句捕获异常, 在处理异常中使用了三个方法,即在处理异常中使用了三个方法,即get Message()、to String()、print Stack Trace()来显示错误信息。从程来显示错误信息。从程 序的运行结果可知,当序的运行结果可知,当catch捕获到异常,进行处理后,程捕获到异常,进行处理后,程 序并没有恢复到产生异常的地方,而是执行序并没有恢复到
50、产生异常的地方,而是执行try-catch- finally结构外紧跟着下一条语句。结构外紧跟着下一条语句。 可见可见catch语句块应该紧跟在语句块应该紧跟在try语句块的后面,当语句块的后面,当try语句语句 块中的某条语句在执行时产生了一个异常时,例如块中的某条语句在执行时产生了一个异常时,例如a整数整数 数组定义为数组定义为2个元素,现要赋一个数个元素,现要赋一个数3至第至第4个元素处个元素处a4, 数组边界超界,将产生并抛出异常类数组边界超界,将产生并抛出异常类Index Out Of Bounds Exception的一个对象,此时被启动的异常处理的一个对象,此时被启动的异常处理
51、机制会自动捕捉到它,然后流程自动跳过产生异常的语句后机制会自动捕捉到它,然后流程自动跳过产生异常的语句后 面的所有尚未执行语句,而转至面的所有尚未执行语句,而转至try块后面的块后面的catch语句块,语句块, 执行执行catch块中的语句。块中的语句。 上一页 下一页返回 5.3异常的处理异常的处理 3、finally 捕获异常的最后一步是通过捕获异常的最后一步是通过finally语句为异常处理提供一个语句为异常处理提供一个 统一的出口,使得在控制流转到程序的其他部分以前,能够统一的出口,使得在控制流转到程序的其他部分以前,能够 对程序的状态作统一的管理。不论在对程序的状态作统一的管理。不论
52、在try代码块中是否发生代码块中是否发生 了异常事件,了异常事件,finally块中的语句都会被执行。块中的语句都会被执行。 Finally语句的存在似乎没有必要。但是如果修改前面的例语句的存在似乎没有必要。但是如果修改前面的例 5-2,得在,得在try代码块中生成一个除代码块中生成一个除0溢出的异常对象。如下溢出的异常对象。如下 所示:所示: Int b=0; System .out .printIn(5/b); 上一页 下一页返回 5.3异常的处理异常的处理 当程序运行时,由于生成了当程序运行时,由于生成了ArithmeticException异常对异常对 象,运行时系统将终止执行,这时打
53、开的文件流将不会被关象,运行时系统将终止执行,这时打开的文件流将不会被关 闭,有可能造成对文件的破坏。使用闭,有可能造成对文件的破坏。使用finally语句,我们可以语句,我们可以 这样处理:这样处理: Finally If (fis!=null) System . out . printIn(“closing FileInputStream”); Fis.close(): else System . out .printIn(“File Input Stream not open”); 这时程序的运行结果为:这时程序的运行结果为: 上一页 下一页返回 5.3异常的处理异常的处理 Closin
54、g FileINput Stream Java . lang. Arithmetic Exception: /bu zero At Exception DemoL . main (ExceptionDemol .java:10) 也许你会说,如果用也许你会说,如果用catch语句捕获这一异常,并在其中关语句捕获这一异常,并在其中关 闭文件流不就可以了吗?但是,如果在闭文件流不就可以了吗?但是,如果在try代码块中有生成代码块中有生成 其他异常了呢?尤其是生成编译器不要求你进行处理的运行其他异常了呢?尤其是生成编译器不要求你进行处理的运行 时异常了呢?不幸的是运行时异常常常是大量存在的,如在时异
55、常了呢?不幸的是运行时异常常常是大量存在的,如在 每个每个catch语句中分别进行处理会使程序变得冗长而失去可语句中分别进行处理会使程序变得冗长而失去可 读性,给程序的维护造成困难。读性,给程序的维护造成困难。 上一页 下一页返回 5.3异常的处理异常的处理 一个一个try块可能产生多种不同的异常,如果希望能采取不同块可能产生多种不同的异常,如果希望能采取不同 的方法来处理这些异常,就需要使用多异常处理机制。多异的方法来处理这些异常,就需要使用多异常处理机制。多异 常处理是通过在一个常处理是通过在一个try块后面定义若干个块后面定义若干个catch块来实现的,块来实现的, 每个每个catch块
56、用来接收和处理一中特定的异常对象。块用来接收和处理一中特定的异常对象。 要想用不同的要想用不同的catch块来分别处理不同的异常对象,首先要块来分别处理不同的异常对象,首先要 求求catch块能够区别这些不同的异常对象,并能判断一个异块能够区别这些不同的异常对象,并能判断一个异 常对象是否应为本块接收和处理。这种判断功能是通过常对象是否应为本块接收和处理。这种判断功能是通过 catch块的参数来实现的。块的参数来实现的。 上一页 下一页返回 5.3异常的处理异常的处理 一个异常对象能否被一个一个异常对象能否被一个catch语句块所接收,主要看该异语句块所接收,主要看该异 常对象与常对象与cat
57、ch块的异常参数的匹配情况,当他们满足下面块的异常参数的匹配情况,当他们满足下面 三个条件的任何一个是,异常对象将被接收:三个条件的任何一个是,异常对象将被接收: (1)异常对象与参数属于相同的异常类;)异常对象与参数属于相同的异常类; (2)异常对象属于参数异常类的子类;)异常对象属于参数异常类的子类; (3)异常对象实现了参数所定义的接口。)异常对象实现了参数所定义的接口。 如果如果try块产生的异常对象被第一个块产生的异常对象被第一个catch块所接收,则程序块所接收,则程序 的流程将直接跳转到这个的流程将直接跳转到这个catch语句块中,语句块执行完毕语句块中,语句块执行完毕 后就推出
58、当前方法,后就推出当前方法,try块中尚未执行的语句和其他的块中尚未执行的语句和其他的catch 块将被忽略;如果块将被忽略;如果try块产生的异常对象与第一个块产生的异常对象与第一个catch块不块不 匹配,系统将自动转到第二个匹配,系统将自动转到第二个catch块进行匹配,如果第二块进行匹配,如果第二 个仍不匹配,就一直向下导一个可以接收该异常对象的个仍不匹配,就一直向下导一个可以接收该异常对象的 catch块,完成流程的跳转。块,完成流程的跳转。 上一页 下一页返回 5.3异常的处理异常的处理 如果所有的如果所有的catch块都不能与当前的异常对象匹配,说明当块都不能与当前的异常对象匹配
59、,说明当 前方法不能处理这个异常对象,程序流程将返回到调用该方前方法不能处理这个异常对象,程序流程将返回到调用该方 法的上层方法,如果这个上层方法中定义了与所产生的异常法的上层方法,如果这个上层方法中定义了与所产生的异常 对象相匹配的对象相匹配的catch块,流程就跳转到这个块,流程就跳转到这个catch块中;否块中;否 则继续回朔更上层的方法,如果所有的方法中都找不到合适则继续回朔更上层的方法,如果所有的方法中都找不到合适 的的catch块,则由块,则由Java运行系统来处理这个异常对象。此时运行系统来处理这个异常对象。此时 通常会中止程序的执行,退出虚拟机返回操作系统,并在标通常会中止程序
60、的执行,退出虚拟机返回操作系统,并在标 准输出上打印相关的异常信息。准输出上打印相关的异常信息。 在另一种完全相反的情况下,假设在另一种完全相反的情况下,假设try块中所有语句的执行块中所有语句的执行 都没有引发异常,则所有的都没有引发异常,则所有的catch块都会被忽略而不予执行。块都会被忽略而不予执行。 上一页 下一页返回 5.3异常的处理异常的处理 在设计在设计catch块处理不同的异常时,一般应注意如下问题:块处理不同的异常时,一般应注意如下问题: (1)catch块中的语句应根据异常的不同执行不同的操作,块中的语句应根据异常的不同执行不同的操作, 比较通用的操作时打印异常和错误的相关
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民盟内部监督制度
- 洁牙内部转诊制度
- 海信企业内部制度
- 海底捞内部薪酬制度
- 火锅店内部员工规章制度
- 煤矿内部医保移交制度
- 煤矿机电内部市场化制度
- 环保局内部管理制度
- 理发店股东内部管理制度
- 监理内部考核制度模板
- 以梦为马 不负韶华2026新年高中开学第一课
- 2025北京市东城区卫生健康委所属事业单位第一次公开招聘396人笔试历年典型考题及考点剖析附带答案详解试卷2套
- 2026年春季第二学期学校德育主题活动工作安排表
- 深度解析(2026)《JTT 761-2022航标灯通 用技术条件》
- 2026届新高考语文三轮冲刺复习:名句名篇默写汇编(课前每日五分钟一练)
- DB37T5336-2025 房屋市政工程安全文明工地建设标准 第1部分:房屋建筑工程
- 2025年R2移动式压力容器充装证考试题库及答案
- 2026年春教科版(新教材)小学科学二年级下册(全册)教学设计(附目录P91)
- 饲养动物应急预案(3篇)
- 大数据与人工智能导论 课件 李建 第1-6章 信息与社会 -数据库技术
- 2026年鄂尔多斯职业学院单招职业倾向性测试题库带答案详解
评论
0/150
提交评论