Java程序设计电子教案第五章.ppt_第1页
Java程序设计电子教案第五章.ppt_第2页
Java程序设计电子教案第五章.ppt_第3页
Java程序设计电子教案第五章.ppt_第4页
Java程序设计电子教案第五章.ppt_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

第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中,当我们在一个文件上建立文件输入流时,如果这个文件并不存在,异常就会生成,另外,在从文件中读取数据时,也可能发生IO异常。,上一页,下一页,返回,5.2异常与异常类,例5-1文件操作异常。Importjava.io.*;ClassExceptionDemolPublicstaticvoidmain(Stringargs)FileInputStreamFis=nesFileInputStream(“text”);Intb;While(b=fis.read()!=-1)System.out.print(b);Fis.close();,上一页,下一页,返回,5.2异常与异常类,当我们编译这个程序时,屏幕上会输出下面的信息:ExceptionDemo1.Java:6:Exceptionjava.io.FileNotFoundExceptionmustbecaught,oritmustbedeclaredinthethrowsclauseofthismethodFileInputStreamfis=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作为除数时,会发生除零溢出的异常事件,使程序无法继续运行。ClassExceptionDem02Publicstaticvoidmain(Stringargs)Inta();System.out.println(5a);我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下:javaLang.ArthmeticException:/byzeroatExceptionDemo2main(ExceptionDemo2.Java:4),上一页,下一页,返回,5.2异常与异常类,在上面的两个例子中,我们都遇到了异常。屏幕上所显示的信息:javaioFileNotFoundException,java.io.IOException以及javaLangArlthmeticException分别指明了异常的类型。同时我们也可以看到,对于一些异常,在程序中必须对它进行处理,否则编译程序会指出错误(如例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:零件为除数等算术异常。IntcrruptedException:线程在睡眠、等待或其他原因暂停时被其他线程扫断。UnknownHostException:无法确定主机的IP地址异常。SecurityException:安全性异常,如Applet欲读写文件。MalfornedURLException:URL格式异常。StringIndexOutOfBoundsException:访问String或StringBuffer字符时,索引小于零或超过字符串长度。,上一页,下一页,返回,5.2异常与异常类,例5-3测试异常程序。importjava.io.*;PublicclassExceptionTestpublicstaticvoidmain(Stringargs)For(inti-0;ijavaExceptionDemoJava.Lang.ArrayINdexOutOfBoundsException()FileINputStreamnotopen第四种情况,程序正常执行完try代码块后,执行finally语句,运行结果如下:C:javaExceptionDemohiFirstargumentishiContenoftextis:Letusbegintoknowjava,learnjavaandmasterjavaclosingFileInputStream,上一页,返回,5.4异常地抛出,在Java程序运行时如果出现一个可识别的错误,就会生成一个与该错误相对应的异常类的对象,并将其传递给Java运行系统,这个过程被称为异常地抛出。根据异常类的不同,抛出异常的方法也不同。5.4.1系统自动抛出的异常在编译例5-1程序中,程序就会指出错误,自动抛出对应的异常,在屏幕上显示:Java.io.FileNotFoundException,java.io.IOException表示该程序给定的文件名未找到以及输入、输出异常。对于这些异常,如果程序不进行处理了,可能会带来意想不到的结果,因此Java编译器要求程序必须抛出这种异常。,下一页,返回,5.4异常地抛出,在例5-2的例子中,程序运行中遇到了错误,系统自动抛出对应的异常,在屏幕上显示:Java.lang.ArithmeticException由于该程序错误地以0为除数,运行过程中就引发算数异常ArithmeticException。同样在例5-3测试异常程序中,涉及了四个错误进行测试,运行后系统自动抛出了对应的四个异常类的对象。以上异常时系统预先定义好的类,对应系统是可识别的错误,所以Java编译器或Java虚拟机遇到这样的错误就会自动中止程序的执行流程,抛出对应的异常。所有的系统定义的编译和运行异常都可以由系统自动抛出,称标准异常,并且Java强烈的要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。,上一页,下一页,返回,5.4异常地抛出,5.4.2语句抛出的异常用户程序自定义的异常和应用程序特定的异常,是不可能依靠系统声明抛出异常和自动抛出异常,而必须借助于throws和throw语句来定义抛出异常,并且确定何种情况算是产生了此种异常对应的错误和抛出这个异常类的新对象。用throws声明抛出异常和用throw语句抛出异常对象的语法格式为:格式修饰符返回类型方法名(参数列表)throws异常类1,异常类2,Throw异常类名;,上一页,下一页,返回,5.4异常地抛出,说明(1)一般这种怕抛出异常的语句应该被定义为在满足一定条件时执行,如把throw语句放在if分支中,只有当if条件得到满足,即用户定义的逻辑错误发生时才执行。(2)自定义被抛出的异常必须是Throwable类或其子类的实例。(3)含有throw语句的方法应该在方法头定义中增加如下的部分:Throws声明抛出异常类名列表即将几个throw语句可能抛出的异常,均集中列入throws中,并用逗号分割开来。声明抛出异常类名列表,就使得异常对象可以依次向后查找,直到有合适的方法捕获他为止。实例见下面“5.5应用举例”一节。在系统不能识别的创建用户自定义的异常时,需要编程者在程序中合适位置创建自定义异常的对象,并利用throw语句将这个新异常对象抛出。,上一页,返回,5.5应用举例,本例演示了如何对异常条件生成用户定义的异常类层,和如何用这些用户定义的异常类编写程序来处理异常条件。例子的第一部分构造了一个报告年龄相关异常的异常类层,如图5-2所示。这个层次的根为AgeException类。它有一个数据成员Age,用于防治导致异常发生的年龄。它有两个子类:类OutOfAgeLimtException用了对于特定任务年龄太小或太老的情况,而类IllegalAgeFormatException用于年龄在合法范围以外或格式有错误的情况。前一个类用数据成员agelinmit来设置可接受的年龄极限,定义这些类的程序如下:,下一页,返回,5.5应用举例,Importjava.io.*;ClassAgeExceptionextendsExceptionIntage;AgeException()Super();AgeException(Stringmessage)Super(message);,上一页,下一页,返回,5.5应用举例,ClassOutOfAgeLimtExceptionextendsAgeExceptionIntageLimit;OutOfAgeLimtExceptionextendsAgeExceptionSuper(message);OutOfAgeLimtException(intageLimit,Stringmessage)Super(message);This.ageLimit=ageLimit;,上一页,下一页,返回,5.5应用举例,ClassTooYoungExceptionextendsOutOfAgeLimtExceptionTooYoungException()Super(“tooyoung”);TooYoungException(intage,intageLimit,Stringmessage)Super(ageLimit,”Youaretooyoungto”+message+”.”);This.age=age;,上一页,下一页,返回,5.5应用举例,ClassTooOldExceptionextendsOutOfAgeLimtExceptionTooOldException()Super(“tooold”);TooOldException(intage,intageLimit,Stringmessage)Super(ageLimit,”Youaretoooldto”+message+”.”);This.age=age;,上一页,下一页,返回,5.5应用举例,classIllegalAgeFormatExceptionextendsAgeExceptionIllegalAgeFormatException(Stringmessage)Super(message);IllegalAgeFormatException()Super(“Illegalageformat”);,上一页,下一页,返回,5.5应用举例,ClassNegativeAgeExcptionextendsIllegalAgeFormatExceptionNegativeAgeExcption(Stringmessage)Super(message);NegativeAgeExcption(intage)Super(“Agemustbenonnegative.”);This.age=age;,上一页,下一页,返回,5.5应用举例,例子的第二部分是使用前构造的异常类层的程序。本程序在不同年龄之间循环,看看特定年龄的人能否作过山车。如果年龄太小、太大或是负数,则方法RideRollerCoasterAtAge()会分别抛出TooYoungException、TooOldException和NegativeageExcption。程序列出如下:PublicclassAgeExceptionTestStaticPrintWriterout=newPrintWriter(System.out,true);StaticvoidrideRollerCoaxterAtAge(intage)ThrowsNetativeAgeExcption,OutOfAgeLimtExceptionOut.printIn(“Tryingtoridearollercoasteratage“+age+”);,上一页,下一页,返回,5.5应用举例,If(age45)ThrownesTooOldException(age,45,”ridearollercoaster”);Out_printIn(“Ridingtherollercoaster”);,

温馨提示

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

评论

0/150

提交评论