七章节异常处理.ppt

上传人:本田雅阁 文档编号:2577476 上传时间:2019-04-11 格式:PPT 页数:29 大小:368.51KB
返回 下载 相关 举报
七章节异常处理.ppt_第1页
第1页 / 共29页
七章节异常处理.ppt_第2页
第2页 / 共29页
七章节异常处理.ppt_第3页
第3页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《七章节异常处理.ppt》由会员分享,可在线阅读,更多相关《七章节异常处理.ppt(29页珍藏版)》请在三一文库上搜索。

1、1,第七章异常处理,主讲教师:张思民,2,习题55,3,习题6-3,4,一个出错的程序,加:A=b;,5,第7章 Java语言中的异常,处理有bug和错误的数据是绝对必要的 捕捉错误的最佳时刻在程序的编译期。 有些问题只能在程序的执行期间来解决:Java提供异常处理机制来解决这些程序执行中可能出现的问题。,6,第7章 Java语言中的异常,本章讲述: 如何在程序中抛出、捕获和处理异常; 如何定制自己的异常类。,7,7.1 异常的概念与分类,Java程序运行中可能遇到的错误分为两类, 一类是非致命性的,通过某种修正后程序还能继续执行。称作异常(Exception)。 例如:试图打开一个不存在的文

2、件,除数为零,对负数开平方根,空指针访问,网络连接中断等。 另一类是致命性的,即程序遇到了非常严重的不正常状态,不能简单地恢复,称作错误(Error)。 例如:JVM系统内部错误、资源耗尽等严重情况,8,7.1 异常的概念与分类,Java提供了面向对象的处理异常的机制。当程序中发生异常时,称该程序产生了一个异常事件,相应地生成异常对象。 异常事件的产生:可能由正在运行的方法生成,也可能由JVM生成。 异常事件包括:所发生的异常事件的类型以及异常发生时程序的运行状态。 生成的异常对象传递给Java运行时系统。 异常的产生和提交称为抛出(throw)。 异常发生时,Java运行时系统会寻找该异常相

3、应的处理代码,并把异常对象提交给该方法处理,这一过程称为捕获(catch)。,9,7.1 异常的概念与分类,10,7.1 异常的概念与分类,Java中的异常分为两类:派生自RuntimeException的异常及非派生自RuntimeException的异常。 通常的规则如下: l产生一个RuntimeException的原因是编程错误。 l其他任何异常的出现是因为你的程序碰到了意外情况,例如一个I/O错误等。例如: 一个错误的造型转换。 一个越界数组访问。 一个空指针访问。,11,7.1 异常的概念与分类,下面几种情况则导致非继承自RuntimeException的异常: l试图读取一个文件

4、结尾后的数据。 l试图打开一个错误的URL。 l试图根据一个根本不代表任何已存在类的字符串来找到一个Class对象。 事实上,你应该尽量避免你的程序出现派生自RuntimeException的异常。 例如:你可以通过判断数组下标是否超出数组边界来避免出现ArrayOutOfBoundException。而如果在使用一个变量之前首先判断它是否为null,则NullPointerException异常就可以避免。,12,7.1 异常的概念与分类,常见的异常: ArithmeticException 整数除法中,如果除数为0,则发生该类异常,如下面的表达式将引发ArithmeticException

5、异常: int i = 12 / 0 ; NullPointerException 如果一个对象还没有被实例化,那么访问该对象或调用他的方法将导致NullPointerException异常,例如: image img = new image 4; System.out.println(img0.toString();,13,7.1 异常的概念与分类,NegativeArraySizeException 按常规,数组元素个数应是一个大于等于0的整数。创建数组时,如果元素个数是负数,则会引发NegativeArraySizeException异常。 ArrayIndexOutOfBoundExc

6、eption Java把数组看作是对象,并用length变量记录数组的大小,访问数组元素时,运行时环境根据length值检查下标的大小。如果数组下标值越界,则会导致ArrayIndexOutOfBoundException异常。 ArrayStoreException: 程序试图在数组中存取错误的数据类型。 FileNotFoundException: 试图存取一个并不存在的文件。,14,7.1 异常的概念与分类,SecurityException 该类异常一般在浏览器内抛出。若Applet试图进行下述操作,则由SecurityManager类抛出此异常: l访问本地文件。 l打开一个套接口,

7、而不是返回到提供Applet的主机。 l在运行时环境中运行另一个程序。 除此之外,较常见的异常还有: IOException: 通常的I/O错误。 SQLException: 执行 SQL时出现错误。,15,7.2.1 try,catch 和finally语句,通常我们希望自己来处理“异常”并继续运行。可以使用try块将可能抛出异常的代码段括起来。 紧跟在try程序后面,应包含catch子句来指定你想要捕捉的“异常”的类型以及相应的处理代码。,16,7.2.1 try,catch 和finally语句,ExceptionType1,ExceptionTypeN是有可能会产生的“异常”的类型。

8、程序运行时,会根据发生异常所属的类,找到相应的catch语句,然后执行其后的语句序列。 提示:如果一个异常类和其子类都有可能出现的话,应把处理子类的catch语句放在前面,否则将永远不会到达子类。,17,7.2.1 try,catch 和finally语句,当一个异常被抛出时,程序的执行就不再是线性的,跳过某些行,甚至会由于没有与之匹配的catch子句而过早地返回。 有时确保一段代码不管发生什么异常都被执行到是必要的,关键词finally就是用来标识这样一段代码的。 除非发生导致程序崩溃的错误,否则不论异常是否被捕获,finally程序块都一定会被执行。将公共处理程序段放到finally块中是

9、个好习惯。,18,7.2.2 try语句的嵌套,可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部,写另一个try语句保护其他代码。 每当遇到一个try语句,“异常”的框架就放到堆栈上面,直到所有的try语句都完成。 如果下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的try语句。,19,例7-2,20,7.2.3 throw语句,throw语句用来明确地抛出一个“异常”。首先,你必须得到一个Throwable的实例的引用(reference),通过参数传到catch子句,或者用new操作符来创建一个。下面是throw语句的通常形式。 th

10、row ThrowableInstance; 程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中从里向外寻找含有与其匹配的catch子句的try块。,21,例7-3一个含有throw语句的例子,22,7.2.4 throws语句,如果一个Java方法遇到了它不能够处理的情况,那么它可以抛出一个异常:一个方法不仅告诉Java编译器它能返回什么值,还可以告诉编译器它有可能产生什么错误。 例如,试图读取文件的方法可能会遇到文件不存在的情况,那么该方法需要通过抛出IOException通知编译器。,23,7.2.4 throws语句,Java中使用 throws 语句

11、实现该功能,throws 语句的语法如下: type MethodName (args) throws ExceptionType /方法实现代码 其中:type为方法的返回值类型,MethodName是方法名,args是方法的参数表,24,例7-4 ExceptionDemo4.java,25,7.3 自定义异常,有时候你会发现标准的异常类可能不能准确地描述你所遇到的问题。 在这种情况下,你需要创建自己的异常类。 通过从Exception类或者他的子类派生一个子类,你可以创建你自己的异常类。,26,7.3 自定义异常,在程序中发生异常情况时,程序员可以抛出(throw)一个自定义异常类的实例

12、,将其放到异常队列中去,并激活Java的异常处理机制。 例如,下面的程序中,我们定义了一个继承自Exception类的异常类MyException, 在compute方法中,如果参数a大于10则抛出一个MyException异常实例,27,例 7-5,程序运行如下: Called compute (1.) Normal exit Called compute (20.) Exception caughtMyException20,28,习题,7.1 什么是异常? 7.2 简述Java是如何处理异常的? 7.3 请说明finally语句的用途。,29,习题,7.4 当程序重新抛出一个新的异常时,原有异常所包含的数据也会随之丢失,例如: try catch(OldException e) throw new NewException(“new exception”); 此时,OldException所包含的数据会遗失。为了避免这种情况,我们可将原有的异常传入新的异常中,这称为chained exception(继承Exception),如: throw new NewException(“new exception”,e); 请生成ChainedException来带到这个目的。,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1