第10章 异常处理_第1页
第10章 异常处理_第2页
第10章 异常处理_第3页
第10章 异常处理_第4页
第10章 异常处理_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、第10章 异常,什么是异常,异常就是在程序的运行过程中所发生的意外事件,它中断指令的正常执行。 Java中提供了一种独特的处理异常的机制,通过异常来处理程序设计中出现的错误。,本章内容,10.1 异常处理 10.2 未捕捉的异常 10.3 try-catch语句 10.4 异常的传递 10.5 异常类层次结构 10.6 I/O异常,10.1 异常处理,一个程序中发生的问题可能产生异常或错误 一个异常(exception)是一个定义非正常情况或错误的对象,由程序或运行时环境抛出,可根据需要进行相应的捕捉和处理。 一个错误(error)类似于异常,不同之处是错误代表不可恢复的问题并且必须捕捉处理。

2、 Java中预定义了一组程序执行中可能发生的异常和错误。,引起异常抛出的问题 试图做除以0的除法 数组索引越界 找不到指定的文件 不能正常完成被请求的I/O操作 使用了空引用 执行的操作违反了某种安全规则 ,异常的处理机制 每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。这就是Java的异常处理机制。,Java中处理异常有两种方式:捕获异常、声明抛弃异常。 捕获异常

3、,就地解决,并使程序继续执行。 声明抛出异常也就是将异常向外转移,即将异常抛出方法之外,由调用该方法的环境去处理。,捕获异常 当Java运行时系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。这是积极的异常处理机制。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。,10.2 未捕捉的异常,若程序不处理异常,则将非正常地终止执行,并产生关于描述在何处发生什么异常的信息。 例:10.1 Zero.java

4、 试图抛出除以0时,抛出ArithmeticException异常,由于程序中没有处理异常的代码,所以当异常发生时程序员将结束执行,并打印有关异常的具体信息。 异常抛出时所打印输出的信息提供了方法调用的堆栈跟踪信息,捕获异常是通过try-catch-finally语句实现的。 处理异常的程序结构如下: try /接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理 catch(要处理的异常种类和标识符) /处理异常 catch(要处理的异常种类和标识符) /处理异常 finally /最终处理 ,10.3 try-catch语句,try-catch-finally语句 1. t

5、ry 捕获异常的第一步是用try选定捕获异常的范围,所有可能抛出异常的语句都放入try模块中。 try模块中的语句是程序正常流程要执行的语句,但是在执行过程中有可能出现异常。 2. catch(必有) 每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的异常事件。catch语句只需要一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的异常对象传递给catch块。,在catch块中是对异常对象进行处理的代码,与访问其它对象一样,可以访问一个异常对象的变量或调用它的方法。getMessage( )是类Throwab

6、le所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。 例如:try.catch( FileNotFoundException e )System.out.println( message:“ +e.getMessage() );e.printStackTrace( System.out );catch( IOException e )System.out.println(e.getMessage() );,catch 语句的顺序:捕获异常的顺序和catch语句的顺序有关,当捕获到一个异常时,剩下

7、的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。 3.finally(可选)捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。,声明抛出异常,1. 抛出异常 在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛弃(throw)异常。 2. 声明抛弃

8、异常 如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃(throws)异常。这是一种消极的异常处理机制。,1. 抛出异常,抛出异常就是产生异常对象的过程,首先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出异常对象是通过throw语句实现的。例如:IOException e=new IOException();throw e ;可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:throw new String(want to throw);,2. 声明抛出异常,如果在一个方法中生成了一个

9、异常,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。 也就是说抛出异常的方法和处理异常的方法不是同一个方法时,则需声明抛出异常。 用方法声明中的throws子句指明。例如:public int read () throws IOException.,throws子句中同时可以指明多个异常,之间由逗号隔开。例如: public static void main(String args) throws IOException, IndexOutOfBoundsException ,设想一个公司

10、用编码表示自己的各种产品。一个产品编码除其他信息外还包括:第一次位上的字符代表产品生产地,第47位上的4位整形数代表产品销售地区。现禁止来自产地R的产品在地区号大于2000的销售区进行销售。 例10.2 ProductCodes.java 读用户编码,统计用户输入的禁销产品编码个数。,10.4 异常的传递,如果在一个异常的发生处没有捕捉和处理异常,控制将立刻返回到产生该异常的方法的上一级调用方法,因此可以将程序设计为在上级调用方法(外层调用)中捕捉和处理异常。如果在上级调用方法中仍然没有捕捉和处理该异常,慢控制将返回到上级调用方法的更上一级调用方法,这个过程称为传递异常。异常将一直传递下去,直

11、到异常被捕捉和处理为止,或直到异常传递出main方法,这种将终止程序的执行并产生异常信息。 如果要捕捉外层异常,则必须将可能产生异常的方法包含在一个try语句中,并且将try语句还应该具有catch子句处理。 例10.3 Propagation.java 例10.4 ExceptionScope.java,10.5 异常类层次结构,在jdk中,每个包中都定义了异常类,而所有的异常类都直接或间接地继承于java.lang.Throwable类。当Java程序遇到不可预料的错误时,会实例化一个从Throwable类继承的对象。 java中的异常类可分为两大类: Error: 错误Error类指的是

12、系统错误或运行环境出现的错误,这些错误一般是很严重的错误,即使捕捉到也无法处理,由Java虚拟机生成并抛出,包括系统崩溃、动态链接失败、虚拟机错误等,在Java程序中不做处理。 Exception: 异常Exception类则是指一些可以被捕获且可能恢复的异常情况,是一般程序中可预知的问题。对于异常可分为两类: (1) 运行时异常:程序中可以不做处理,直接由运行时系统来处理。 (2) 非运行时异常:在程序中必须对其进行处理,否则编译器会指出错误。,异常类的结构层次,Exception类,1Exception类 Exception类的构造方法 Exception类有两种构造方法: Excepti

13、on():没有指定的消息串,直接构造一个Exception。 Exception(String exp):根据参数提供的消息串,创建一个Exception。 例如,创建一个异常对象: Exception myExp=new Exception(“异常!”);,常用方法: Exception类的方法均继承自Throwable类,可以为程序提供一些有关异常的信息,常用方法如下: String getMessage() :返回该异常所存储的描述性字符串。 String toString():返回异常对象的详细信息,包含该类名和指出所发生问题的描述性消息的字符串。 void printStackTra

14、ce():将异常发生的路径,即引起异常的方法调用嵌套序列打印到标准错误流。 例如: System.out.println(myExp.getMessage(); 此语句可以将异常对象myExp的异常信息描述打印输出,在屏幕上显示“异常!”。,1用户自定义异常 在程序中,可以创建自定义的异常类。用户自定义的异常类都要直接或间接地继承Exception类。可按照下面的方法自定义一个异常类: (1) 创建一个继承Exception类或者其它已存在的异常类的子类。 (2) 在该类中创建一个默认的无参数构造方法,该构造方法以适当的错误消息作为输入,调用它的超类的构造方法。 (3) 再增加一个带字符串参数

15、的构造方法,该构造方法以适当的错误消息作为输入(还包括输入的字符串)来调用其超类相应的构造方法。,例如,定义一个继承于Exception类的用户自定义异常类,语句如下: class MyException extends Exception MyException() super(“数据错误!”); MyException(String exp) super(exp); 例10.5 CreatingException.java 例10.6 OutOfRangeException.java,3 可检测异常和不可检测异常 可检测异常 一个可检测异常必须由一个方法捕捉,或必须在可能抛出或传递异常的方

16、法的throws子句中列出来。 在一个方法的声明头中追加一个throws子句,就明确承诺了该方法在异常发生时将抛出或传递异常。 一个不可检测异常则不需要使用throws子句。 对于可检测异常,如果发生异常的方法不捕捉和处理这个异常,则必须在该方法定义的声明中包含throws。 唯一的不可检测异常是RuntimeException类的对象或该类的后代对象。,10.6 I/O异常,一个流是一个有序的字节序列;流可以用做输入源或作为输出的目的地。(输入流/输出流) 标准I/O流中有三种流:System.in;System.out; System.err,这些对象引用变量都声明为public和stat

17、ic,可以通过System类直接访问。 一旦需要创建InputMismatchException异常对象。 Java标准类库的java.io还提供了许多类,可定义具有不同特点的各种流,分别处理文件,内存或字符串。,I/O类执行的许多操作都可能抛出IOException异常。它是可检测的。 由于I/O经常处理外部资源,执行I/O操作的程序因此可能产生许多问题 例10.7 TestData.java,为何使用意外处理:,把出错处理和正常代码分开。比如有程序是处理文件,大家看流程,这个流程中充满了错误可能。 readFile 打开文件;打不开咋办? 判断大小;大小判断失败怎么办?(磁带) 分配内存;

18、内存不够 读入内存;文件读不出来 关掉文件; 文件关不掉。 解决方法:写大量的if语句。,传统的错误检测和纠正,errorCodeType readFile initialize errorCode = 0; 打开文件; if (打开文件成功) 判断文件长 if (文件长取到) 分配内存 if (分内存成功) 读入内存 if (读文件失败) errorCode = -1; /读文件判断 else errorCode = -2; /分配内存失败 else errorCode = -3; /取不到文件长 关闭文件; if (文件没关 ,从上面的流程可看出真正有用的代码不多,就五条而已,其它全部是判断错误用的,主要逻辑都被错误处理代码混得看不清

温馨提示

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

评论

0/150

提交评论