第10章 异常处理.ppt

上传人:s****8 文档编号:67216017 上传时间:2022-12-24 格式:PPT 页数:32 大小:452.50KB
返回 下载 相关 举报
第10章 异常处理.ppt_第1页
第1页 / 共32页
第10章 异常处理.ppt_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《第10章 异常处理.ppt》由会员分享,可在线阅读,更多相关《第10章 异常处理.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

18、 关掉文件;文件关不掉。n解决方法:写大量的if语句。传统的错误检测和纠正errorCodeType readFile initialize errorCode=0;打开文件打开文件;if(打开文件成功打开文件成功)判断文件长判断文件长 if(文件长取到文件长取到)分配内存分配内存 if(分内存成功分内存成功)读入内存读入内存 if(读文件失败读文件失败)errorCode=-1;/读文件判断读文件判断 else errorCode=-2;/分配内存失败分配内存失败 else errorCode=-3;/取不到文件长取不到文件长 关闭文件关闭文件;if(文件没关文件没关&errorCode=0

19、)errorCode=-4;else errorCode=errorCode and-4;else errorCode=-5;return errorCode;n从上面的流程可看出真正有用的代码不多,就五条而已,其它全部是判断错误用的,主要逻辑都被错误处理代码混得看不清了,程序可读性差,出错返回信息量太少。n在Java中,处理这种情况的方法是利用异常处理,把出错处理和正常代码分开,Java异常处理通过5个关键字try,catch,finally,throw和throws进行管理。Java的解决方式的解决方式readFile/结构清楚,无需自己判断,代码量小。try 打开文件;判断大小;分配内存;读入内存;关掉文件;catch(文件打开失败)处理代码;catch(大小取不到失败)处理代码;catch(内存分配失败)处理代码;catch(读取失败)处理代码;catch(文件关闭失败)处理代码;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁