您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java程序设计电子教案第五章
第5章异常5.1编程中的错误5.2异常与异常类5.3异常的处理5.4异常地抛出5.5应用举例5.1编程中的错误程序中出现的错误必须要处理,否则程序会错误退出或带来错误的结果和状态,造成越来越多的异常现象。根据错误的性质和特点,—般可把错误分为编译错误和运行错误两种。5.1.1编译错误编译错误是由于所编码的程序存在语法问题,未能通过内源代码到目标码的编译过程而产生的,它是由语言的编译系统负责检测和报告。下一页返回5.1编程中的错误每种计算机高级语言都有自己的语法规范,编译系统就根据这个规范来检查编程人员所书写的源代码(程序)是否符合既定的标准。有的高级语言的语法规定得比较严格,有的语言则给编程人员很大的自由度,如C语言,程序可以写得很灵活,使编程者可充分发挥他们的核心和能力。Java语言是定位于网络计算的安全性要求较高的语言,它的语法规范设计得比较全面,相对于C语言增加了不少规定。例如,数组元素下标越界检查、检查对未开辟空间对象的使用等。由于更多的检查工作由系统自动完成,可以减少编程者的设计负担和程序中的隐含错误,提高初学者编程的成功率。上一页下一页返回5.1编程中的错误大部分编译错误是由于对语法不熟悉或拼写失误等引起的,例如在Java语言中规定:需在每个句子的末尾使用分号,标识符区分大小写,如果不注意这些细杰,就会引发编译错误。由于编译系统会给出每个编译错误的位置和相关的错误信息,所以修改编译错误相对较简单;但同时由于编译系统判定错误比较机械,再参考他所指出的错误地点和信息时应灵活的同时参照上下文其他语句,将程序作为一个整体来检查。没有编译错误是一个程序能正常运行的基本条件,只有所有的编译错误都改正了,源代码才可以被成功的编译成目标代码或字节代码。上一页下一页返回5.1编程中的错误5.1.2运行错误一个没有编译错误的可执行或解释的程序,距离完全正确的程序通常还有一段距离,这是因为排除了编译错误,程序中可能还存在着运行错误。运行错误是在程序的运行过程中产生的错误。根据性质不同,运行错误还可分为系统运行错误和逻辑运行错误。上一页下一页返回5.1编程中的错误系统错误是指程序在执行过程中引发了操作系统的问题。应用程序是工作在计算机的操作系统平台上的,如果应用程序运行时所产生的运行错误危及操作系统,对操作系统产生损害,就有可能造成整个计算机的瘫痪,例如死机、死循环等。所以不排除系统运行错误,程序就不能正常地工作。系统运行错误通常比较隐秘,排除时应根据错误的现象,结合源程序仔细判断。例如,出现死循环,就应该检测源程序中的循环语句及其中止条件;出现死机,就应该检查程序中的内存分配处理语句等。上一页下一页返回5.1编程中的错误排除了系统运行错误,程序可以顺利执行了,却仍然不能代表它已经毫无问题了。因为程序中还有可能存在着逻辑运行错误。逻辑运行错误是指程序不能实现编程人员的设计意图和设计功能而产生的错误,例如排序时不能正确处理数组头后的元素等。有些逻辑运算错误是由于算法考虑不周引起的,也有些则来自编码过程中的疏忽。排除运行错误时,一个非常有效和常用的手段是使用开发环境所提供的单步运行机制和设置断点功能来分解程序运行过程,使之在人为的控制下边调试边运行。在调试过程中,调试者可以随时检查变量中保存的中间量,设置临时运行环境,一步一步地检查程序的执行过程,从而挖出隐藏的错误。上一页返回5.2异常与异常类5.2.1异常处理机制概述异常就是在程序的运行过程中所发生的异常事件(不正常现象),它中断指令的正常执行。在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象,故又称为特殊的运行错误对象。很多类型的错误也都会导致异常的产生,如需要打开的文件不存在、内存不够、数据访问超界、严重者导致硬盘崩溃等,都会影响程序的正常执行。在网络环境中运行的Java程序,安全是首先考虑的重要元素之一。为了能够及时有效地处理程序中的远行错误,Java中通过引入异常和异常类来处理。作为面向对象的语言,异常与其他语言要素一样,是面向对象规范的一部分,是异常类的对象。下一页返回5.2异常与异常类Java中定义了很多异常类,每个异常类都代表了一种运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。这就是java的异常处理机制。如在例5-1中,当我们在一个文件上建立文件输入流时,如果这个文件并不存在,异常就会生成,另外,在从文件中读取数据时,也可能发生I/O异常。上一页下一页返回5.2异常与异常类[例5-1]文件操作异常。Importjava.io.*;ClassExceptionDemol{Publicstaticvoidmain(Stringargs[]){FileInputStreamFis=nesFileInputStream(“text”);Intb;While((b=fis.read())!=-1){System.out.print(b);}Fis.close();}}上一页下一页返回5.2异常与异常类当我们编译这个程序时,屏幕上会输出下面的信息:ExceptionDemo1.Java:6:Exceptionjava.io.FileNotFoundExceptionmustbecaught,oritmustbedeclaredinthethrowsclauseofthismethod.FileInputStreamfis=newFileInputStream(“text”);^ExceptionDemol.java:8:Exceptionjava.io.IOExceptionmustbecaught,oritmustbedeclaredinthethrowsclauseofthismethod.While((b=fis.read())!=-1){^上一页下一页返回5.2异常与异常类2errors在Java程序的执行过程中,异常对象可能是由正在运行的方法生成,也可能由Java虚拟机生成,其中包含一些信息指明异常事件的类型以及当异常发生时程序的运行状态等。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。当Java运行时系统得到一个异常对象时,它将会寻找处理这一异常的代码。寻找的过程从生成异常对象的代码块开始,沿着方法的调用栈逐层回溯,直到找到一个方法能够处理这种类型的异常为止。然后运行时系统把当前异常对象交给这个方法进行处理。这一过成称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。例5-2中出现的即为这种情况。上一页下一页返回5.2异常与异常类[例5-2]当0作为除数时,会发生除零溢出的异常事件,使程序无法继续运行。ClassExceptionDem02{Publicstaticvoidmain(Stringargs[]){Inta=();System.out.println(5/a);}}我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下:java.Lang.ArthmeticException:/byzeroatExceptionDemo2.main(ExceptionDemo2.Java:4)上一页下一页返回5.2异常与异常类在上面的两个例子中,我们都遇到了异常。屏幕上所显示的信息:java.ioFileNotFoundException,java.io.IOException以及java.LangArlthmeticException分别指明了异常的类型。同时我们也可以看到,对于一些异常,在程序中必须对它进行处理,否则编译程序会指出错误(如例5-1)。但对另一些异常,在程序中可以不做处理,而直接由运行时系统来处理(如例5-2)。使用异常处理程序出错有以下两个原因:一是将错误处理程序与正常程序流分开,增加程序的可读性和可维护性;二是可容易的指出异常在何处处理。上一页下一页返回5.2异常与异常类5.2.2异常类结构与组成在java类库的每个包中都定义了异常类,所有这些类都是类Throwable的子类。Throwable类属于类库java.lang包中的一个类,在程序中不必使用import语句引入即可食用。Throwable类派生了两个子类:Exception和Error。其中Error类由系统保留,而Exception类则供应用程序使用。Java作为面向对象设计语言,它定义了很多标准的异常处理类,采用捕获-抛出(catch-throw)方式,捕获并处理异常。上一页下一页返回5.2异常与异常类Error类的子类有后缀Error,它们用于指示异常系统条件。例如OutOfMemoryError表示虚拟机内存超界,内存单元收集程序无法获得更多的内存:StackOverFlowError表示翻译器中堆栈溢出。这些Error类的子类包括动态链接失败、虚拟机错误等,通常Java程序不捕获这些异常,也不会抛出这种异常。一般来说,这些异常是不可修复的,不易处理。Exception类的子类一般是可以修复的。例如EOFException表示打开的文件不再有可读数据;FileNorFoundException表示打开的文件在文件系统中不存在。这一子类是Java程序中所大量处理的异常。并且同其他的类一样,Exception类有自己的方法和属性。他的构造函数有两个:上一页下一页返回5.2异常与异常类[格式]publicException();PublicException(Strings);[说明]第二个接受字符串参数传入的信息,通常是对该异常所对应错误的描述。Exception类从父类Throwable那里还继承了若干方法,其中常用的有:[格式]publicStringtoString();[说明]显示异常信息以及getMessage()返回信息的简短描述的字符串。[格式]publicvoidprintStackTrace();[说明]打印异常发生处堆栈跟踪信息,包括异常的类名、方法名及所在程序的行数,没有返回值,实际上它的功能是完成一个打印操作,在当前的标准输出(一般就是屏幕)上打印输出当前异常对象的堆栈使用轨迹,也即程序先后调用执行了哪些对象或类的那些方法,使得运算过程中产生了这个异常对象。上一页下一页返回5.2异常与异常类[格式]publicStingGetMessage();[说明]获得与异常和错误相关的更详细的错误信息,但非每个异常都有详细信息。如果没有详细信息,该方法调用后返回空值。5.2.3系统定义的运行异常Exception类有若干子类,每一个子类代表了一种特定的运行时异常。其中有些是系统实现定义好并包含在Java类库中的,称为系统定义的运行异常。系统定义的运行异常通常对应着系统运行错误。由于这种错误可能导致操作系统错误甚至ishi整个系统的瘫痪,如例5-1所涉及到的FileNotFoundException和IOException。对于这类异常来说,如果程序不进行处理,可能会带来意想不到的结果,所以定义异常类来特别处理,下面列出若干常见的系统定义运行异常:上一页下一页返回5.2异常与异常类ClassNotFoundException:未找到欲装载使用的类异常。ArrayIndexOnOfBoundsException:数组越界异常,即小雨或超过数组界限使用。FileNotFoundException:引用空的尚无内存空间的对象异常。ArithmeticException:零件为
本文标题:Java程序设计电子教案第五章
链接地址:https://www.777doc.com/doc-61556 .html