Java程序设计电子教案第五章.ppt

上传人:牧羊曲112 文档编号:6510016 上传时间:2023-11-07 格式:PPT 页数:73 大小:334.49KB
返回 下载 相关 举报
Java程序设计电子教案第五章.ppt_第1页
第1页 / 共73页
Java程序设计电子教案第五章.ppt_第2页
第2页 / 共73页
Java程序设计电子教案第五章.ppt_第3页
第3页 / 共73页
Java程序设计电子教案第五章.ppt_第4页
第4页 / 共73页
Java程序设计电子教案第五章.ppt_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《Java程序设计电子教案第五章.ppt》由会员分享,可在线阅读,更多相关《Java程序设计电子教案第五章.ppt(73页珍藏版)》请在三一办公上搜索。

1、第5章 异常,5.1 编程中的错误5.2异常与异常类5.3异常的处理5.4 异常地抛出5.5应用举例,5.1 编程中的错误,程序中出现的错误必须要处理,否则程序会错误退出或带来错误的结果和状态,造成越来越多的异常现象。根据错误的性质和特点,般可把错误分为编译错误和运行错误两种。5.1.1 编译错误编译错误是由于所编码的程序存在语法问题,未能通过内源代码到目标码的编译过程而产生的,它是由语言的编译系统负责检测和报告。,下一页,返回,5.1 编程中的错误,每种计算机高级语言都有自己的语法规范,编译系统就根据这个规范来检查编程人员所书写的源代码(程序)是否符合既定的标准。有的高级语言的语法规定得比较

2、严格,有的语言则给编程人员很大的自由度,如C语言,程序可以写得很灵活,使编程者可充分发挥他们的核心和能力。Java语言是定位于网络计算的安全性要求较高的语言,它的语法规范设计得比较全面,相对于C语言增加了不少规定。例如,数组元素下标越界检查、检查对未开辟空间对象的使用等。由于更多的检查工作由系统自动完成,可以减少编程者的设计负担和程序中的隐含错误,提高初学者编程的成功率。,上一页,下一页,返回,5.1 编程中的错误,大部分编译错误是由于对语法不熟悉或拼写失误等引起的,例如在Java语言中规定:需在每个句子的末尾使用分号,标识符区分大小写,如果不注意这些细杰,就会引发编译错误。由于编译系统会给出

3、每个编译错误的位置和相关的错误信息,所以修改编译错误相对较简单;但同时由于编译系统判定错误比较机械,再参考他所指出的错误地点和信息时应灵活的同时参照上下文其他语句,将程序作为一个整体来检查。没有编译错误是一个程序能正常运行的基本条件,只有所有的编译错误都改正了,源代码才可以被成功的编译成目标代码或字节代码。,上一页,下一页,返回,5.1 编程中的错误,5.1.2 运行错误一个没有编译错误的可执行或解释的程序,距离完全正确的程序通常还有一段距离,这是因为排除了编译错误,程序中可能还存在着运行错误。运行错误是在程序的运行过程中产生的错误。根据性质不同,运行错误还可分为系统运行错误和逻辑运行错误。,

4、上一页,下一页,返回,5.1 编程中的错误,系统错误是指程序在执行过程中引发了操作系统的问题。应用程序是工作在计算机的操作系统平台上的,如果应用程序运行时所产生的运行错误危及操作系统,对操作系统产生损害,就有可能造成整个计算机的瘫痪,例如死机、死循环等。所以不排除系统运行错误,程序就不能正常地工作。系统运行错误通常比较隐秘,排除时应根据错误的现象,结合源程序仔细判断。例如,出现死循环,就应该检测源程序中的循环语句及其中止条件;出现死机,就应该检查程序中的内存分配处理语句等。,上一页,下一页,返回,5.1 编程中的错误,排除了系统运行错误,程序可以顺利执行了,却仍然不能代表它已经毫无问题了。因为

5、程序中还有可能存在着逻辑运行错误。逻辑运行错误是指程序不能实现编程人员的设计意图和设计功能而产生的错误,例如排序时不能正确处理数组头后的元素等。有些逻辑运算错误是由于算法考虑不周引起的,也有些则来自编码过程中的疏忽。排除运行错误时,一个非常有效和常用的手段是使用开发环境所提供的单步运行机制和设置断点功能来分解程序运行过程,使之在人为的控制下边调试边运行。在调试过程中,调试者可以随时检查变量中保存的中间量,设置临时运行环境,一步一步地检查程序的执行过程,从而挖出隐藏的错误。,上一页,返回,5.2异常与异常类,5.2.1 异常处理机制概述异常就是在程序的运行过程中所发生的异常事件(不正常现象),它

6、中断指令的正常执行。在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象,故又称为特殊的运行错误对象。很多类型的错误也都会导致异常的产生,如需要打开的文件不存在、内存不够、数据访问超界、严重者导致硬盘崩溃等,都会影响程序的正常执行。在网络环境中运行的Java程序,安全是首先考虑的重要元素之一。为了能够及时有效地处理程序中的远行错误,Java中通过引入异常和异常类来处理。作为面向对象的语言,异常与其他语言要素一样,是面向对象规范的一部分,是异常类的对象。,下一页,返回,5.2异常与异常类,Java中定义了很多异常类,每个异常类都代表了一种运行错误,类中包含了该运行错误的信息和处理

7、错误的方法等内容。每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。这就是java的异常处理机制。如在例5-1中,当我们在一个文件上建立文件输入流时,如果这个文件并不存在,异常就会生成,另外,在从文件中读取数据时,也可能发生IO异常。,上一页,下一页,返回,5.2异常与异常类,例5-1 文件操作异常。Import java.io.*;Class Exception De

8、mol 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异常与异常类,当我们编译这个程序时,屏幕上会输出下面的信息:ExceptionDemo1.Java:6:Exception java.io.File Not Found Exception must be caught,or it must be declared

9、 in the throws clause of this methodFile Input Stream fis=new File Input Stream(“text”);ExceptionDemol.java:8:Exception java.io.IOException must be caught,or it must be declared in the throws clause of this method.While(b=fis.read()!=-1),上一页,下一页,返回,5.2异常与异常类,2 errors在Java程序的执行过程中,异常对象可能是由正在运行的方法生成,也

10、可能由Java虚拟机生成,其中包含一些信息指明异常事件的类型以及当异常发生时程序的运行状态等。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。当Java运行时系统得到一个异常对象时,它将会寻找处理这一异常的代码。寻找的过程从生成异常对象的代码块开始,沿着方法的调用栈逐层回溯,直到找到一个方法能够处理这种类型的异常为止。然后运行时系统把当前异常对象交给这个方法进行处理。这一过成称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。例5-2中出现的即为这种情况。,上一页,下一页,返回

11、,5.2异常与异常类,例5-2 当0作为除数时,会发生除零溢出的异常事件,使程序无法继续运行。Class ExceptionDem02 Public static void main(String args)Int a();System.out.println(5a);我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下:javaLang.ArthmeticException:/by zero at ExceptionDemo2main(ExceptionDemo2.Java:4),上一页,下一页,返回,5.2异常与异常类,在上面的两个例子中,我们都遇到了异常。屏幕上所显示的信息:j

12、avaio File Not Found Exception,java.io.IOException以及 javaLang Arlthmetic Exception分别指明了异常的类型。同时我们也可以看到,对于一些异常,在程序中必须对它进行处理,否则编译程序会指出错误(如例5-1)。但对另一些异常,在程序中可以不做处理,而直接由运行时系统来处理(如例5-2)。使用异常处理程序出错有以下两个原因:一是将错误处理程序与正常程序流分开,增加程序的可读性和可维护性;二是可容易的指出异常在何处处理。,上一页,下一页,返回,5.2异常与异常类,5.2.2 异常类结构与组成在java类库的每个包中都定义了异

13、常类,所有这些类都是类Throwable的子类。Throwable类属于类库java.lang包中的一个类,在程序中不必使用import语句引入即可食用。Throwable类派生了两个子类:Exception和Error。其中Error类由系统保留,而Exception类则供应用程序使用。Java作为面向对象设计语言,它定义了很多标准的异常处理类,采用捕获-抛出(catch-throw)方式,捕获并处理异常。,上一页,下一页,返回,5.2异常与异常类,Error类的子类有后缀Error,它们用于指示异常系统条件。例如Out Of Memory Error表示虚拟机内存超界,内存单元收集程序无法

14、获得更多的内存:Stack Over Flow Error表示翻译器中堆栈溢出。这些Error类的子类包括动态链接失败、虚拟机错误等,通常Java程序不捕获这些异常,也不会抛出这种异常。一般来说,这些异常是不可修复的,不易处理。Exception类的子类一般是可以修复的。例如EOF Exception表示打开的文件不再有可读数据;File Nor Found Exception表示打开的文件在文件系统中不存在。这一子类是Java程序中所大量处理的异常。并且同其他的类一样,Exception类有自己的方法和属性。他的构造函数有两个:,上一页,下一页,返回,5.2异常与异常类,格式 public

15、Exception();Public Exception(String s);说明 第二个接受字符串参数传入的信息,通常是对该异常所对应错误的描述。Exception类从父类Throwable那里还继承了若干方法,其中常用的有:格式 public String to String();说明 显示异常信息以及getMessage()返回信息的简短描述的字符串。格式 public void print StackTrace();说明 打印异常发生处堆栈跟踪信息,包括异常的类名、方法名及所在程序的行数,没有返回值,实际上它的功能是完成一个打印操作,在当前的标准输出(一般就是屏幕)上打印输出当前异常对

16、象的堆栈使用轨迹,也即程序先后调用执行了哪些对象或类的那些方法,使得运算过程中产生了这个异常对象。,上一页,下一页,返回,5.2异常与异常类,格式 public Sting GetMessage();说明 获得与异常和错误相关的更详细的错误信息,但非每个异常都有详细信息。如果没有详细信息,该方法调用后返回空值。5.2.3 系统定义的运行异常Exception类有若干子类,每一个子类代表了一种特定的运行时异常。其中有些是系统实现定义好并包含在Java类库中的,称为系统定义的运行异常。系统定义的运行异常通常对应着系统运行错误。由于这种错误可能导致操作系统错误甚至ishi整个系统的瘫痪,如例5-1所

17、涉及到的File Not Found Exception和IO Exception。对于这类异常来说,如果程序不进行处理,可能会带来意想不到的结果,所以定义异常类来特别处理,下面列出若干常见的系统定义运行异常:,上一页,下一页,返回,5.2异常与异常类,Class Not Found Exception:未找到欲装载使用的类异常。ArrayIndexOnOfBoundsException:数组越界异常,即小雨或超过数组界限使用。File Not Found Exception:引用空的尚无内存空间的对象异常。Arithmetic Exception:零件为除数等算术异常。Intcrrupted

18、 Exception:线程在睡眠、等待或其他原因暂停时被其他线程扫断。Un known Host Exception:无法确定主机的IP地址异常。Security Exception:安全性异常,如Applet欲读写文件。Malforned URL Exception:URL格式异常。String Index Out Of Bounds Exception:访问String或String Buffer字符时,索引小于零或超过字符串长度。,上一页,下一页,返回,5.2异常与异常类,例5-3 测试异常程序。import java.io.*;Public class Exception Test p

19、ublic static void main(String args)For(int i-0;i4;i+)Int k;Try Switch(i)Case();/divided 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 bou

20、nd Char ch-“abc”.charAt(99);Break;catch(Exception e)System.out.printIn(“nTestcase#”+i+”n”);System.out.printIn(e);,上一页,下一页,返回,5.2异常与异常类,运行测试程序的输出结果如下:Test case#0Java.lang.Arithmetic Exception:/by zeroTest case#1Java.lang.Null Pointer Exception;Test case#2Java.lang.Array Index Out Of Bounes ExceptionT

21、est case#3,上一页,下一页,返回,5.2异常与异常类,Java.lang.String Index Out Of Bounds Exception:Stingindes out of range:99由于定义了相应的异常,Java程序即使产生一些致命的错误,如引用空对象的等,系统也会自动产生一个对应的异常对象来处理和控制这个错误,避免其蔓延或产生更大的问题。5.2.4 用户自定义的异常对于某个应用所特有的运行错误,则需要编程人员根据程序的特殊逻辑在用户程序里自己创建用户自定义的异常类和异常对象。这种用户自定义异常主要用来处理用户程序中特定的逻辑运行错误。定义一个Employee类的构

22、造函数:,上一页,下一页,返回,5.2异常与异常类,Employee(String name,double initSal)/有两个参数的构造函数,利用这两个参数初始化/雇员姓名、工资并初始化雇员编号This();m_EmpName=new String(name);If(initSalm,MinSalary)System.exit(0);M_EmpSalary=initSal;,上一页,下一页,返回,5.2异常与异常类,在这个方法里,一旦给出的雇员工资初值不符合最低工资的规定,则直接退出整个程序的运行。这样处理虽然保证了程序的逻辑正确性,但却没有给出足够的错误提示信息,如果程序里还有其他类似

23、的处理,那么当产生错误退出运行时,用户将无法得知到底是什么错误导致了这次推出,对于程序的调试和运行都很不方便。为了解决这个问题,我们可以定义一个用户程序异常IIIegalSalaryException,专门处理上述“发给雇员的工资低于系统要求的最低工资”的逻辑错误。,上一页,下一页,返回,5.2异常与异常类,Public class IllegatSalaryException Extends Exception/自定义的系统类Exception的子类 Private Emplouee m_ConcernedEmp:/产生当前错误的Employee对象的引用 Pribate double m_

24、IllegalSalary;/产生当前错误的非法的工资数额 IllegalSalaryException()Super(“不合法的起薪:低于最低工资限额”);/调用父类Exception的构造函数,上一页,下一页,返回,5.2异常与异常类,IllegalSalaryException(Employee emp,double iSal)/构造函数 This();M_ConcernedEmp=emp;/初始化两个属性 M_illegalSalary=iSal;Public String to String()/重载父类的方法,给出详细的错误信息 String s;,上一页,下一页,返回,5.2异常

25、与异常类,If(m_ConcernedEmp!=null)S=”为雇员提供非法工资;雇员号_”+m_ComcernedEmp.getEmpNo()+”非法工资数额_”+m+IllegalSalary+”合法的最低工资数额_”+Employee.getMinSalary();Else S=”给出的工资初始值不合理,不能创建Employee对象”;Return s;,上一页,下一页,返回,5.2异常与异常类,用户自定义异常用来处理程序中可能产生的逻辑错误,使得这种错误能够被系统及时识别并处理,而不致造成更大的影响,从而使用户程序更为稳定,有更灵活的容错性能,并使整个系统更加安全。创建用户自定义异常

26、时,一般需要完成如下的工作:(1)声明一个新的异常类,使之以Exception类或其他某个已经存在的系统异常类或用户异常类为父类;(2)为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。只有定义了异常类,系统才能够识别特定的运行错误,才能够及时地控制和处理运行错误;所以定义足够多的异常类是构建一个稳定完善的应用系统的重要基础之一。,上一页,返回,5.3异常的处理,5.3.1 try-catch-finally异常的处理是通过try-catch-finally语句实现的。其语法为:格式 try 正常程序段;catch(Execption Name

27、 1 e)/catch(异常类 1 异常变量)与异常类1有关的处理程序段;catch(Execption Name 2 e)与异常类2有关的处理程序段;,下一页,返回,5.3异常的处理,catch(Exception Namen e)与异常类n有关的处理程序段;finally 推出异常程序段;说明 在try-catch-finally语句结构中,catch语句和finally语句是可选的,但是至少要有一个catch语句或finally语句。1、try捕获异常的第一步是用try选定捕获异常的范围,由try所限定的代码块中的语句,在执行过程中可能会生成异常对象)(抛出异常)。这个try语句块用来启

28、动java的异常处理机制,可能抛出异常的语句,包括throw语句、调用可能抛出异常方法的调用语句,都应该包含在这个try语句块中。,上一页,下一页,返回,5.3异常的处理,2、catch捕捉异常当一个异常被抛出时,应该有专门的语句来接收这个被抛出的异常对象,这个过程被称为捕捉异常。当一个异常类的对象被捕捉获接收后,用户程序就会发生流程的跳转,系统中止当前的流程而跳转至专门的异常处理语句块,或直接跳出当前程序和Java虚拟机回到操作系统。Java语言规定,每个catch语句块都应该与一个try语句块相对应,每个try代码块也必须伴随一个或多个catch语句,用于处理try代码块中所生成的异常事件

29、。Catch语句只需要一个形式参数,参数类型指明它能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的异常对象传递给catch块。其格式如下:,上一页,下一页,返回,5.3异常的处理,格式 catch(异常类名 异常形式参数名)与异常类有关的处理语句组;因此,在Java程序里,异常对象是依靠以catch语句为标志的异常处理语句块来捕捉和处理的。异常处理语句块又称为catch语句块。在catch块中是对异常对象进行处理的代码,预防为其他对象一样,可以访问一个异常对象的变量或调用它的方法。Get Message()是类Throw able所提供的方法,用来得到有

30、关异常事件的信息,类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 Of Bounds Exception e)System.err.printIn(“excep

31、tion 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?”);Public static void main(String args)New TryTest();,上一页,下一页,返回,5.3异常的处理,例5-4设计了一个数组超界异

32、常。用catch语句捕获异常,在处理异常中使用了三个方法,即get Message()、to String()、print Stack Trace()来显示错误信息。从程序的运行结果可知,当catch捕获到异常,进行处理后,程序并没有恢复到产生异常的地方,而是执行try-catch-finally结构外紧跟着下一条语句。可见catch语句块应该紧跟在try语句块的后面,当try语句块中的某条语句在执行时产生了一个异常时,例如a整数数组定义为2个元素,现要赋一个数3至第4个元素处a4,数组边界超界,将产生并抛出异常类Index Out Of Bounds Exception的一个对象,此时被启动

33、的异常处理机制会自动捕捉到它,然后流程自动跳过产生异常的语句后面的所有尚未执行语句,而转至try块后面的catch语句块,执行catch块中的语句。,上一页,下一页,返回,5.3异常的处理,3、finally捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其他部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。Finally语句的存在似乎没有必要。但是如果修改前面的例5-2,得在try代码块中生成一个除0溢出的异常对象。如下所示:Int b=0;System.out.printIn(5

34、/b);,上一页,下一页,返回,5.3异常的处理,当程序运行时,由于生成了ArithmeticException异常对象,运行时系统将终止执行,这时打开的文件流将不会被关闭,有可能造成对文件的破坏。使用finally语句,我们可以这样处理:Finally If(fis!=null)System.out.printIn(“closing FileInputStream”);Fis.close():else System.out.printIn(“File Input Stream not open”);这时程序的运行结果为:,上一页,下一页,返回,5.3异常的处理,Closing FileINp

35、ut StreamJava.lang.Arithmetic Exception:/bu zero At Exception DemoL.main(ExceptionDemol.java:10)也许你会说,如果用catch语句捕获这一异常,并在其中关闭文件流不就可以了吗?但是,如果在try代码块中有生成其他异常了呢?尤其是生成编译器不要求你进行处理的运行时异常了呢?不幸的是运行时异常常常是大量存在的,如在每个catch语句中分别进行处理会使程序变得冗长而失去可读性,给程序的维护造成困难。,上一页,下一页,返回,5.3异常的处理,5.3.2 多异常的处理一个try块可能产生多种不同的异常,如果希望

36、能采取不同的方法来处理这些异常,就需要使用多异常处理机制。多异常处理是通过在一个try块后面定义若干个catch块来实现的,每个catch块用来接收和处理一中特定的异常对象。要想用不同的catch块来分别处理不同的异常对象,首先要求catch块能够区别这些不同的异常对象,并能判断一个异常对象是否应为本块接收和处理。这种判断功能是通过catch块的参数来实现的。,上一页,下一页,返回,5.3异常的处理,一个异常对象能否被一个catch语句块所接收,主要看该异常对象与catch块的异常参数的匹配情况,当他们满足下面三个条件的任何一个是,异常对象将被接收:(1)异常对象与参数属于相同的异常类;(2)

37、异常对象属于参数异常类的子类;(3)异常对象实现了参数所定义的接口。如果try块产生的异常对象被第一个catch块所接收,则程序的流程将直接跳转到这个catch语句块中,语句块执行完毕后就推出当前方法,try块中尚未执行的语句和其他的catch块将被忽略;如果try块产生的异常对象与第一个catch块不匹配,系统将自动转到第二个catch块进行匹配,如果第二个仍不匹配,就一直向下导一个可以接收该异常对象的catch块,完成流程的跳转。,上一页,下一页,返回,5.3异常的处理,如果所有的catch块都不能与当前的异常对象匹配,说明当前方法不能处理这个异常对象,程序流程将返回到调用该方法的上层方法

38、,如果这个上层方法中定义了与所产生的异常对象相匹配的catch块,流程就跳转到这个catch块中;否则继续回朔更上层的方法,如果所有的方法中都找不到合适的catch块,则由Java运行系统来处理这个异常对象。此时通常会中止程序的执行,退出虚拟机返回操作系统,并在标准输出上打印相关的异常信息。在另一种完全相反的情况下,假设try块中所有语句的执行都没有引发异常,则所有的catch块都会被忽略而不予执行。,上一页,下一页,返回,5.3异常的处理,在设计catch块处理不同的异常时,一般应注意如下问题:(1)catch块中的语句应根据异常的不同执行不同的操作,比较通用的操作时打印异常和错误的相关信息

39、,包括异常名称、产生异常的方法名等。(2)由于异常对象与catch块的匹配是按照catch块的先后排列顺序进行的,所以在处理多异常时应注意认真设计各catch块的排列顺序。一般地,处理较具体的较常见的异常的catch块应放在前面,而可以与多种异常相匹配的catch块应放在较后的位置。,上一页,下一页,返回,5.3异常的处理,例如,对例5-1中的异常,可以这样处理:Try catch(File Not Found Exception e)System.out.println(e);System.out.println(“massage:”+e.getMessage();e.printStackT

40、race(System.out);catchIOException System.out.println(e);,上一页,下一页,返回,5.3异常的处理,这里使用了两个catch语句分别对try代码块中可能出现的两个异常事件进行处理。如果要打开的文件“text”不存在,程序运行时就会显示下面的信息:Java.io.File Not Found Exception:textMassage:textJava.io.File Not Found Exception:text At java.io.FilelnputStream.(FilelnputStream.java)At Exception D

41、emol.main(Exception Demol.java:7),上一页,下一页,返回,5.3异常的处理,IOException是File Not Found Exception的父类,从程序的执行结果可以看到,捕获IOException对象的代码块并没有被执行。这是因为当运行时系统查找处理异常的代码时,首先从调用堆栈的最顶端开始,也就是从生成异常对象的方法开始(例中为File Input Stream的构造方法)。由于FileInputStream的构造方法中没有处理异常的catch语句,运行时系统沿调用栈向后回朔进入方法main(),方法main()中有两个catch语句,运行时系统把异

42、常对象行的类型依次和每个catch语句的参数类型进行比较,如果类型相匹配,则把该异常交给这个catch代码块。这里,匹配是指参数类型与异常对象的类型完全相同,或者为其父类。因此第一个catch块被执行。捕获异常的顺序是和不同catch语句的顺序相关的,如果在上例中把两个catch语句的次序换一下,则在编译时会出现下面的信息:,上一页,下一页,返回,5.3异常的处理,Exception Demol.java:15:catch not reached.catch(FileNotFound Exception e)1 error由于第一个catch语句首先得到匹配,第二个catch语句将不会被执行。

43、因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。同时也看到,如果catch语句所捕获的异常类型不是一个“终极”类型(即它有子类),则一个catch语句可以同时捕获多种异常。如例中的Catch(IOException e),上一页,下一页,返回,5.3异常的处理,除了可以捕获File Not Found Exception异常对象以外,还可以捕获EOFException异常对象,只要他们是IOException类的子类即可。但通常在指定所捕获的异常类型时,应避免选择最一般的类型(如Exception)。否则,当异常事件发生时,程序中不能确切判断异常的具体类型并作出

44、相应处理以从错误中恢复。例5-5 多捕获异常的不同情况。Import java.io.*;Class Exception Demo Public Static Void main(String args)Throws IO Exception FileInputStream fis=null;,上一页,下一页,返回,5.3异常的处理,Try System.out.printIn(“first argument is“+args0);Fis=nes FileInput Stream(“text”);System.out.printIn(“content of text is:”);Int b:W

45、hine(b=fis.Read()!=-1)System.out.print(char)b);catch(Exception e)/蒋截获所有异常对象,使后面的catch块不能执行,需删除 System.out.printIn(e);,上一页,下一页,返回,5.3异常的处理,catch(FileNot FoundException e)System.out.printIn(e);catch(IOException e)System.out.printIn(e);catch(IndexOutOfBoundException e)System.out.printIn(e);finally,上一页,

46、下一页,返回,5.3异常的处理,If(fis!=null)System.out.printIn(“closing FileInputStream”);Fis.close();else System.out.printIn(File Input Stream not open”);,上一页,下一页,返回,5.3异常的处理,第一种情况,由于所有的异常都是Exception类的子类,这个catch块就可以与所有的异常对象匹配,排在他后面的catch块将永远不被使用。正确的方法是将以Exception为参数的catch块放在最后的位置。如果去掉以Exception为参数的catch块则执行结果为下面几

47、种情况。(在实际运行该例题时,应将这种情况去掉!)第一种情况,要打开的文件”text”不存在,程序运行时回生成File Not Found Exception 类的实例,运行时系统把它交给第一个catch块处理,最后执行finally语句,运行结果如下:,上一页,下一页,返回,5.3异常的处理,C:java Exception Demo hiFirst argument is hiJava.io.FileNotFoundException:testFileINputStream not open第三种情况,我们创建了文件”text”,但是在运行程序时不给出任何参数,这时会生成Index Out

48、 Of Bounds Exception类的异常,它是运行时异常,运行时系统把它交给第三个catch语句,最后执行finally语句,运行结果如下:,上一页,下一页,返回,5.3异常的处理,C:java ExceptionDemoJava.Lang.Array INdexOutOfBoundsException()FileINputStream not open第四种情况,程序正常执行完try代码块后,执行finally语句,运行结果如下:C:java ExceptionDemo hiFirst argument is hiConten of text is:Let us begin to k

49、now java,learn java and master java closing FileInputStream,上一页,返回,5.4 异常地抛出,在Java程序运行时如果出现一个可识别的错误,就会生成一个与该错误相对应的异常类的对象,并将其传递给Java运行系统,这个过程被称为异常地抛出。根据异常类的不同,抛出异常的方法也不同。5.4.1 系统自动抛出的异常在编译例5-1程序中,程序就会指出错误,自动抛出对应的异常,在屏幕上显示:Java.io.FileNotFoundException,java.io.IOException表示该程序给定的文件名未找到以及输入、输出异常。对于这些异常

50、,如果程序不进行处理了,可能会带来意想不到的结果,因此Java编译器要求程序必须抛出这种异常。,下一页,返回,5.4 异常地抛出,在例5-2的例子中,程序运行中遇到了错误,系统自动抛出对应的异常,在屏幕上显示:Java.lang.ArithmeticException由于该程序错误地以0为除数,运行过程中就引发算数异常ArithmeticException。同样在例5-3测试异常程序中,涉及了四个错误进行测试,运行后系统自动抛出了对应的四个异常类的对象。以上异常时系统预先定义好的类,对应系统是可识别的错误,所以Java编译器或Java虚拟机遇到这样的错误就会自动中止程序的执行流程,抛出对应的异

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号