Java语言程序设计 教学课件 PPT 作者 辛运帏 饶一梅 第七章

上传人:E**** 文档编号:89383648 上传时间:2019-05-24 格式:PPT 页数:33 大小:1.29MB
返回 下载 相关 举报
Java语言程序设计 教学课件 PPT 作者 辛运帏 饶一梅 第七章_第1页
第1页 / 共33页
Java语言程序设计 教学课件 PPT 作者 辛运帏 饶一梅 第七章_第2页
第2页 / 共33页
Java语言程序设计 教学课件 PPT 作者 辛运帏 饶一梅 第七章_第3页
第3页 / 共33页
Java语言程序设计 教学课件 PPT 作者 辛运帏 饶一梅 第七章_第4页
第4页 / 共33页
Java语言程序设计 教学课件 PPT 作者 辛运帏 饶一梅 第七章_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《Java语言程序设计 教学课件 PPT 作者 辛运帏 饶一梅 第七章》由会员分享,可在线阅读,更多相关《Java语言程序设计 教学课件 PPT 作者 辛运帏 饶一梅 第七章(33页珍藏版)》请在金锄头文库上搜索。

1、第7章 JAVA语言中的异常,异常,编写程序时多多少少总会有些错误,程序中的语法错误会在编译时被发现并修正,而有些错误是发生在运行阶段的。 这些错误依照其严重程度分为两类, 一类是致命性的严重错误,它们的出现可能会导致系统崩溃,并且程序员并不能编写程序解决所出现的问题。 另一类是普通级别的错误,这类错误如果不加控制就使程序非正常中断,但如果编写代码来处理的话,就有可能避免中断程序的执行。这类错误一般地称为异常(Exception),用来处理异常的过程称为异常处理。,异常,在Java中主要有三类异常。事实上,Java定义了类java.lang.Throwable,它是使用异常处理机制可被抛出并捕

2、获的所有异常对象的父类。它有三个基本子类,如下图:,异常,每个类的使用目的不同。 Error表示很难恢复的错误。一般不期望用户程序来处理,即使程序员有能力处理这种错误,也还是交给系统处理为好。 RuntimeException用来表示设计或实现方面的问题。因为设计和实现正确的程序不会引发这类异常,所以常常不处理它。发生这类异常时,运行时环境会输出一条信息,提示用户修正错误。 其他异常表示运行时因环境的影响可能发生并可被处理的问题。因为用户的错误很可能导致这类问题发生,我们要学习的是如何处理这类异常。,异常示例,例7-1 文件操作功能描述 openTheFile; /打开文件 determine

3、 its size; /获取文件的长度 allocate that much memory; /分配内存 read-file; /读文件 closeTheFile; /关闭文件 实现文件读取的程序大多有上述这样的程序框架。因为文件存放在外存,程序要访问文件时必须先要将文件放入内存然后才能访问。这段程序是顺序执行结构,而前一句执行的结果又直接影响后一句是否能执行。如果中间哪一条语句执行不正确,后续语句都不能正确执行,程序也会中断。所以凡是有输入输出操作的语句都可能会出现问题。,异常示例,例7-2 增加了约束的文件操作功能描述 openFiles; /打开文件 if (theFilesOpen)

4、/判定打开是否正确 determine the length of the file; /获取文件的长度 if (gotTheFileLength) /判定已得到文件长度 allocate that much memory; /分配内存 if (gotEnoughMemory) /内存分配成功 read the file into memory; /读文件 if (readFailed) errorCode=-1;/读取失败 else errorCode = -2; /读取成功 closeTheFile; /关闭文件 else errorCode=-3; /内存分配不成功 else error

5、Code=-4 ; /没有得到文件长度 else errorCode=-5; /文件打开不正确,异常,程序发生异常时称为产生了一个异常事件,系统根据异常生成一个异常对象。 根据这个异常的种类,该对象可能由正在运行的方法生成,也可能由JVM生成。异常对象中包含了该异常必要的详细说明信息,包括所发生的异常事件的类型及异常发生时程序的运行状态。 生成的异常对象传递给Java运行时系统,运行时系统寻找相应的代码来处理这一异常。 我们把生成异常对象并把它提交给运行时系统的这一过程称为抛出(throw)一个异常。,异常,异常发生后,Java运行时系统从生成对象的代码块开始进行回溯,沿方法的调用栈逐层回溯寻

6、找处理代码,并把异常对象交给该方法处理,这一过程称为捕获(catch)。如图所示:,异常处理方式示例,下面用异常处理方式重写例7-2。 try openTheFile; /打开文件 determine its size; /获取文件的长度 allocate that much memory; /分配内存 read-File; /读文件 closeTheFile; /关闭文件 catch(fileopenFailed) /文件打开失败的处理代码; catch(sizeDetermineFailed) /不能获得文件大小的处理代码; catch(memoryAllocateFailed) /内存分

7、配失败的处理代码; catch(readFailed) /读文件失败的处理代码; catch(fileCloseFailed) /关闭文件失败的处理代码; finally /需要统一处理的代码; ,异常类和错误类,Java语言在所有的预设包中都定义了异常类Exception和错误类Error。Exception类是所有异常的父类,Error类是所有错误的父类,这两个类同时又是Throwable的子类。它们的层次结构如图所示:,异常处理相关语句,虽然引发某个具体异常的语句可能是一条,但相关的语句可能会有多条,程序中使用try语句将这些语句全部括住。 在try语句后面是一组catch语句,对所括住

8、的语句可能引发的异常进行分类,对每一种类型的异常提供一段相应的处理代码,每种异常对应一个catch语句。,try与catch语句,try与catch语句的语法格式如下: try / 此处为抛出具体异常的代码 catch (ExceptionType1 e) / 抛出ExceptionType1异常时要执行的代码 catch (ExceptionType2 e) / 抛出ExceptionType2异常时要执行的代码 . catch (ExceptionTypek e) / 抛出ExceptionTypek异常时要执行的代码 finally / 必须执行的代码 其中,ExceptionType1

9、,ExceptionType2,ExceptionTypek是产生的异常类型。根据发生异常所属的类,找到对应的catch语句,然后执行后面的语句序列。,Finally语句,异常处理中有一个特殊的语句,即finally语句。它是最后一条语句,Java规定,不论是否捕获到异常,总要执行finally后面的语句。即使try块中包含return、break、continue、throw等语句,finally语句也会被执行。finally语句不执行的情况只有一种,即在保护代码内执行了System.exit()方法后,将不再执行finally后面的语句,这是不执行finally后面语句的惟一一种可能。,公

10、共处理示例,例7-4 公共处理示例 try openfile (); /打开文件 read_file(); /读文件 finally closefile(); /关闭文件 因为closefile ()方法放到了finally块中,所以总被执行。,公共处理示例,再看下面的例子。程序7-3总会输出“finally”,而“aftertry”仅在aVar的值不等于10时才被输出。 程序7-3 公共处理的完整代码 public class tryAgain public static void main (String args) int aVar = 0; try if(aVar = 10) retu

11、rn; finally System.out.println(“finally“); System.out.println(“aftertry“); ,公共异常,(1) ArithmeticException异常。进行表达式计算时,除数不能为零。当程序中出现除数为零,或在整数运算中对零取模时,就会发生该类异常。如下面表达式将引发ArithmeticException异常: int i = 12 / 0; /除数为0 float avar = 12 % 0; /对0取模,公共异常,(2) ArrayIndexOutOfBoundsException异常。这是数组下标越界异常。数组元素的个数在数组

12、初始化时已经确定下来,程序中访问数组元素时,不能超过数组的长度。系统根据length值来检查数组下标表达式,如果超出这个值,则将导致该异常。见下例。 例7-5 数组下标越界 class ArrayOut public static void main(String args) int aArray = new int3; aArray3 = 0; /数组下标只能是0、1、2 ,公共异常,(3) IncompatibleClassChangeException异常。这是类不兼容异常。当修改一个类的定义后,引用该类的其它类没有重新编译,就会产生该异常。对应的情况有以下两类: 一个类中的变量声明由静

13、态变成非静态,或由非静态变成静态,而其它访问该类这一变量的类没有被重新编译。 类中声明的某个域或是某个方法被删除,而其它访问该域或该方法的类没有被重新编译。 (4) IncompatibleTypeException异常。这是类型不兼容异常。名字虽然与前一个异常很类似,但含义不相同。如果试图定义一个接口的实例,则会引发IncompatibleTypeException异常。,公共异常,(5) NegativeArraySizeException异常。这是数组元素个数为负异常。数组长度应该是一个大于等于0的整数,所以定义数组时,方括号中的数不能写负数。当然,如果定义一个元素个数为零的数组是没有使

14、用价值的,所以也应该避免。创建数组时,如果指定的元素个数是个负数,则会引发该异常。 例7-6 引发数组元素个数为负异常示例 class NegArray public static void main(String args) int aVar = new int-1; /数组元素个数不能是负数 aVar0 = 0; ,公共异常,(6) NoClassDefFoundException异常。这是类未定义异常。如果一个类被引用,但在运行时,系统没有找到被引用的类,就会引发该异常。 例如,声明一个NoClass类,其中用到了另一个类anotherClass,但系统找不到这个类,引发类未定义异常。

15、例7-7 类未定义异常示例 class NoClass public static void main(String args) anotherClass aCVar = new anotherClass(); ,公共异常,(7) NullPointerException异常。这是空指针异常。如果一个对象的值是null,而程序试图访问它的变量或方法,或者访问一个空数组中的元素时,都将导致该异常。看下面的例子。 例7-8 引发空指针异常示例 class NullObject public static void main(String args) String oString = null; /

16、空串 int aArray = null; /空数组 oString.length(); /不能访问空串的方法 aArray0 = 0; /不能访问空数组的元素 程序中创建了两个对象,分别是空字符串和没有初始化的数组。对它们的访问都会导致空指针异常。,公共异常,(8) OutOfMemoryException异常。这是内存溢出异常。当系统无法再向应用程序提供内存时,会引发该异常。这种异常只能出现在创建新对象的时候,即new被调用的时候。 例7-9 引发内存溢出异常示例 class Link int a = new int1000000; Link l; class NullObject public stati

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号