资源预览内容
第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
第9页 / 共29页
第10页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第七章第七章异常处理主讲教师:张思民主讲教师:张思民1习题习题552习题习题6-33一个出错的程序一个出错的程序加:加:A=b;4第第7章章Java语言中的异常语言中的异常处理有处理有bugbug和错误的数据是绝对必要的和错误的数据是绝对必要的捕捉错误的最佳时刻在程序的编译期。捕捉错误的最佳时刻在程序的编译期。有有些些问问题题只只能能在在程程序序的的执执行行期期间间来来解解决决:JavaJava提提供供异异常常处处理理机机制制来来解解决决这这些些程程序序执执行行中中可可能能出现的问题。出现的问题。5第第7章章Java语言中的异常语言中的异常本章讲述:本章讲述:如何在程序中抛出、捕获和处理异常;如何在程序中抛出、捕获和处理异常;如何定制自己的异常类。如何定制自己的异常类。67.1异常的概念与分类异常的概念与分类Java程序运行中可能遇到的错误分为两类,程序运行中可能遇到的错误分为两类,一类是非致命性的,通过某种修正后程序还能继续执行。称作异常(异常(Exception)。例如:试图打开一个不存在的文件,除数为零,对负数开平方根,空指针访问,网络连接中断等。另一类是致命性的,即程序遇到了非常严重的不正常状态,不能简单地恢复,称作错误错误(Error)。例如:JVM系统内部错误、资源耗尽等严重情况77.1异常的概念与分类异常的概念与分类Java提提供供了了面面向向对对象象的的处处理理异异常常的的机机制制。当当程程序序中中发发生生异异常常时时,称称该该程程序序产产生生了了一一个个异异常常事事件件,相相应应地地生成异常对象。生成异常对象。异异常常事事件件的的产产生生:可可能能由由正正在在运运行行的的方方法法生生成成,也也可可能由能由JVM生成。生成。异异常常事事件件包包括括:所所发发生生的的异异常常事事件件的的类类型型以以及及异异常常发发生生时程序的运行状态。时程序的运行状态。生成的异常对象传递给生成的异常对象传递给Java运行时系统。运行时系统。异常的产生和提交称为抛出(异常的产生和提交称为抛出(throw)。)。异异常常发发生生时时,Java运运行行时时系系统统会会寻寻找找该该异异常常相相应应的的处处理理代代码码,并并把把异异常常对对象象提提交交给给该该方方法法处处理理,这这一一过过程称为捕获(程称为捕获(catch)。)。87.1异常的概念与分类异常的概念与分类ThrowableExceptionRuntimeExceptionIOExceptionError97.1异常的概念与分类异常的概念与分类Java中的异常分为两类:派生自RuntimeException的异常及非派生自RuntimeException的异常。通常的规则如下:l产生一个RuntimeException的原因是编程错误。l其他任何异常的出现是因为你的程序碰到了意外情况,例如一个I/O错误等。例如:一个错误的造型转换。一个越界数组访问。一个空指针访问。107.1异常的概念与分类异常的概念与分类下面几种情况则导致非继承自RuntimeException的异常:l试图读取一个文件结尾后的数据。l试图打开一个错误的URL。l试图根据一个根本不代表任何已存在类的字符串来找到一个Class对象。事实上,你应该尽量避免你的程序出现派生自RuntimeException的异常。例如:你可以通过判断数组下标是否超出数组边界来避免出现ArrayOutOfBoundException。而如果在使用一个变量之前首先判断它是否为null,则NullPointerException异常就可以避免。117.1异常的概念与分类异常的概念与分类常见的异常:ArithmeticException整数除法中,如果除数为0,则发 生 该 类 异 常 , 如 下 面 的 表 达 式 将 引 发ArithmeticException异常:inti=12/0;NullPointerException如果一个对象还没有被实例化,那 么 访 问 该 对 象 或 调 用 他 的 方 法 将 导 致NullPointerException异常,例如:imageimg=newimage4;System.out.println(img0.toString();127.1异常的概念与分类异常的概念与分类NegativeArraySizeException按常规,数组元素个数应是一个大于等于0的整数。创建数组时,如果元素个数是负数,则会引发NegativeArraySizeException异常。ArrayIndexOutOfBoundExceptionJava把数组看作是对象,并用length变量记录数组的大小,访问数组元素时,运行时环境根据length值检查下标的大小。如果 数 组 下 标 值 越 界 , 则 会 导 致ArrayIndexOutOfBoundException异常。ArrayStoreException:程序试图在数组中存取错误的数据类型。FileNotFoundException:试图存取一个并不存在的文件。137.1异常的概念与分类异常的概念与分类SecurityException该类异常一般在浏览器内抛出。若Applet试图进行下述操作,则由SecurityManager类抛出此异常:l访问本地文件。l打开一个套接口,而不是返回到提供Applet的主机。l在运行时环境中运行另一个程序。除此之外,较常见的异常还有:IOException:通常的I/O错误。SQLException:执行SQL时出现错误。147.2.1 7.2.1 try,catchtry,catch 和和finallyfinally语句语句通常我们希望自己来处理通常我们希望自己来处理“异常异常”并继续运行。可以使并继续运行。可以使用用trytry块将可能抛出异常的代码段括起来。块将可能抛出异常的代码段括起来。 紧跟在紧跟在trytry程序后面,应包含程序后面,应包含catchcatch子句来指定你想要捕捉的子句来指定你想要捕捉的“异异常常”的类型以及相应的处理代码。的类型以及相应的处理代码。157.2.1 7.2.1 try,catchtry,catch 和和finallyfinally语句语句ExceptionType1,ExceptionTypeN是有可能会是有可能会产生的产生的“异常异常”的类型。的类型。程序运行时,会根据发生异常所属的类,找到程序运行时,会根据发生异常所属的类,找到相应的相应的catch语句,然后执行其后的语句序列。语句,然后执行其后的语句序列。提提示示:如如果果一一个个异异常常类类和和其其子子类类都都有有可可能能出出现现的的话话,应应把把处处理理子子类类的的catch语语句句放放在在前前面面,否则将永远不会到达子类。否则将永远不会到达子类。167.2.1 7.2.1 try,catch try,catch 和和finallyfinally语句语句当当一一个个异异常常被被抛抛出出时时,程程序序的的执执行行就就不不再再是是线线性性的的,跳跳过过某某些些行行,甚甚至至会会由由于于没没有有与与之之匹匹配配的的catch子子句句而过早地返回。而过早地返回。有有时时确确保保一一段段代代码码不不管管发发生生什什么么异异常常都都被被执执行行到到是是必必要的,关键词要的,关键词finally就是用来标识这样一段代码的。就是用来标识这样一段代码的。除除非非发发生生导导致致程程序序崩崩溃溃的的错错误误,否否则则不不论论异异常常是是否否被被捕捕获获,finally程程序序块块都都一一定定会会被被执执行行。将将公公共共处处理理程程序段放到序段放到finally块中是个好习惯。块中是个好习惯。177.2.2try语句的嵌套语句的嵌套可可以以在在一一个个成成员员函函数数调调用用的的外外面面写写一一个个try语语句句,在在这这个成员函数内部,写另一个个成员函数内部,写另一个try语句保护其他代码。语句保护其他代码。每每当当遇遇到到一一个个try语语句句,“异异常常”的的框框架架就就放放到到堆堆栈栈上上面,直到所有的面,直到所有的try语句都完成。语句都完成。如如果果下下一一级级的的try语语句句没没有有对对某某种种“异异常常”进进行行处处理理,堆堆栈栈就就会会展展开开,直直到到遇遇到到有有处处理理这这种种“异异常常”的的try语句。语句。18例7-2197.2.3throw语句语句throw语语句句用用来来明明确确地地抛抛出出一一个个“异异常常”。首首先先,你你必必须须得得到到一一个个Throwable的的实实例例的的引引用用(reference),通通过过参参数数传传到到catch子子句句,或或者者用用new操操作作符符来来创创建建一一个个。下下面面是是throw语语句的通常形式。句的通常形式。throwThrowableInstance;程程序序会会在在throw语语句句后后立立即即终终止止,它它后后面面的的语语句句执执行行不不到到,然然后后在在包包含含它它的的所所有有try块块中中从从里里向外寻找含有与其匹配的向外寻找含有与其匹配的catch子句的子句的try块。块。20例例7-3一个一个含有含有throw语句的例子语句的例子217.2.4throws语句语句如如果果一一个个Java方方法法遇遇到到了了它它不不能能够够处处理理的的情情况况,那那么么它它可可以以抛抛出出一一个个异异常常:一一个个方方法法不不仅仅告告诉诉Java编编译译器器它它能能返返回回什什么么值值,还还可可以以告告诉诉编编译译器它有可能产生什么错误。器它有可能产生什么错误。例例如如,试试图图读读取取文文件件的的方方法法可可能能会会遇遇到到文文件件不不存存在在的的情情况况,那那么么该该方方法法需需要要通通过过抛抛出出IOException通知编译器。通知编译器。227.2.4throws语句语句Java中中使使用用throws语语句句实实现现该该功功能能,throws语语句的语法如下:句的语法如下:typeMethodName(args)throwsExceptionType/方法实现代码方法实现代码其其中中:type为为方方法法的的返返回回值值类类型型,MethodName是方法名,是方法名,args是方法的参数表是方法的参数表23例7-4ExceptionDemo4.java247.3自定义异常自定义异常有有时时候候你你会会发发现现标标准准的的异异常常类类可可能能不不能能准准确确地地描述你所遇到的问题。描述你所遇到的问题。在这种情况下,你需要创建自己的异常类。在这种情况下,你需要创建自己的异常类。通通过过从从Exception类类或或者者他他的的子子类类派派生生一一个个子子类类,你可以创建你自己的异常类。你可以创建你自己的异常类。257.3自定义异常自定义异常在程序中发生异常情况时,程序员可以抛出在程序中发生异常情况时,程序员可以抛出(throw)一个自定义异常类的实例,将其放一个自定义异常类的实例,将其放到异常队列中去,并激活到异常队列中去,并激活Java的异常处理机制。的异常处理机制。例如,下面的程序中,我们定义了一个继承自例如,下面的程序中,我们定义了一个继承自Exception类的异常类类的异常类MyException,在在compute方法中,如果参数方法中,如果参数a大于大于10则抛出一则抛出一个个MyException异常实例异常实例26例例7-5程序运行如下:程序运行如下:Calledcompute(1.)NormalexitCalledcompute(20.)ExceptioncaughtMyException2027习题7.1什么是异常?什么是异常?7.2简述简述Java是如何处理异常的?是如何处理异常的?7.3请说明请说明finally语句的用途。语句的用途。28习题习题7.4当当程程序序重重新新抛抛出出一一个个新新的的异异常常时时,原原有有异异常常所所包包含含的的数数据据也也会随之丢失,例如:会随之丢失,例如:trycatch(OldExceptione)thrownewNewException(“newexception”);此此时时,OldException所所包包含含的的数数据据会会遗遗失失。为为了了避避免免这这种种情情况况,我我们们可可将将原原有有的的异异常常传传入入新新的的异异常常中中,这这称称为为chainedexception(继承继承Exception),),如:如:thrownewNewException(“newexception”,e);请生成请生成ChainedException来带到这个目的。来带到这个目的。29
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号