JAVA语言中的异常课件

上传人:桔**** 文档编号:572722188 上传时间:2024-08-13 格式:PPT 页数:33 大小:259.50KB
返回 下载 相关 举报
JAVA语言中的异常课件_第1页
第1页 / 共33页
JAVA语言中的异常课件_第2页
第2页 / 共33页
JAVA语言中的异常课件_第3页
第3页 / 共33页
JAVA语言中的异常课件_第4页
第4页 / 共33页
JAVA语言中的异常课件_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《JAVA语言中的异常课件》由会员分享,可在线阅读,更多相关《JAVA语言中的异常课件(33页珍藏版)》请在金锄头文库上搜索。

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

2、va定义了类java.lang.Throwable,它是使用异常处理机制可被抛出并捕获的所有异常对象的父类。它有三个基本子类,如下图: JAVA语言中的异常异常异常每个类的使用目的不同。Error表示很难恢复的错误。一般不期望用户程序来处理,即使程序员有能力处理这种错误,也还是交给系统处理为好。RuntimeException用来表示设计或实现方面的问题。因为设计和实现正确的程序不会引发这类异常,所以常常不处理它。发生这类异常时,运行时环境会输出一条信息,提示用户修正错误。其他异常表示运行时因环境的影响可能发生并可被处理的问题。因为用户的错误很可能导致这类问题发生,我们要学习的是如何处理这类异

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

4、A语言中的异常异常示例异常示例例7-2 增加了约束的文件操作功能描述openFiles; /打开文件 if (the)/判定打开是否正确 determine the length of the file; /获取文件的长度 if (gotThe)/判定已得到文件长度 allocate that much memory; /分配内存 if (gotEnoughMemory)/内存分配成功 read the memory; /读文件 if (readFailed) errorCode=-1;/读取失败 else errorCode = -2;/读取成功 closeTheFile;/关闭文件 els

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

6、言中的异常异常异常异常发生后,Java运行时系统从生成对象的代码块开始进行回溯,沿方法的调用栈逐层回溯寻找处理代码,并把异常对象交给该方法处理,这一过程称为捕获(catch)。如图所示: JAVA语言中的异常异常处理方式示例异常处理方式示例下面用异常处理方式重写例7-2。 try openTheFile;/打开文件 determine its size;/获取文件的长度 allocate that much memory;/分配内存 read-File;/读文件 closeTheFile;/关闭文件 catch() /文件打开失败的处理代码; catch(sizeDetermineFailed

7、) /不能获得文件大小的处理代码; catch(memoryAllocateFailed) /内存分配失败的处理代码; catch(readFailed) /读文件失败的处理代码; catch() /关闭文件失败的处理代码; finally /需要统一处理的代码; JAVA语言中的异常异常类和错误类异常类和错误类Java语言在所有的预设包中都定义了异常类Exception和错误类Error。Exception类是所有异常的父类,Error类是所有错误的父类,这两个类同时又是Throwable的子类。它们的层次结构如图所示: JAVA语言中的异常异常处理相关语句异常处理相关语句 虽然引发某个具体

8、异常的语句可能是一条,但相关的语句可能会有多条,程序中使用try语句将这些语句全部括住。 在try语句后面是一组catch语句,对所括住的语句可能引发的异常进行分类,对每一种类型的异常提供一段相应的处理代码,每种异常对应一个catch语句。JAVA语言中的异常try与与catch语句语句 try与catch语句的语法格式如下: try / 此处为抛出具体异常的代码 catch (ExceptionType1 e) / 抛出ExceptionType1异常时要执行的代码 catch (ExceptionType2 e) / 抛出ExceptionType2异常时要执行的代码 . catch (E

9、xceptionTypek e) / 抛出ExceptionTypek异常时要执行的代码 finally / 必须执行的代码 其中,ExceptionType1,ExceptionType2,ExceptionTypek是产生的异常类型。根据发生异常所属的类,找到对应的catch语句,然后执行后面的语句序列。JAVA语言中的异常Finally语句语句异常处理中有一个特殊的语句,即finally语句。它是最后一条语句,Java规定,不论是否捕获到异常,总要执行finally后面的语句。即使try块中包含return、break、continue、throw等语句,finally语句也会被执行。f

10、inally语句不执行的情况只有一种,即在保护代码内执行了System.exit()方法后,将不再执行finally后面的语句,这是不执行finally后面语句的惟一一种可能。 JAVA语言中的异常公共处理示例公共处理示例例7-4 公共处理示例 try openfile (); /打开文件 read_file(); /读文件 finally closefile(); /关闭文件 因为closefile ()方法放到了finally块中,所以总被执行。JAVA语言中的异常公共处理示例公共处理示例再看下面的例子。程序7-3总会输出“finally”,而“aftertry”仅在aVar的值不等于10

11、时才被输出。程序7-3 公共处理的完整代码 public class tryAgain public static void main (String args) int aVar = 0; try if(aVar = 10) return; finally System.out.println(finally); System.out.println(aftertry); JAVA语言中的异常公共异常公共异常 (1) ArithmeticException异常。进行表达式计算时,除数不能为零。当程序中出现除数为零,或在整数运算中对零取模时,就会发生该类异常。如下面表达式将引发Arithmet

12、icException异常: int i = 12 / 0;/除数为0 float avar = 12 % 0;/对0取模JAVA语言中的异常公共异常公共异常 (2) ArrayIndexOutOfBoundsException异常。这是数组下标越界异常。数组元素的个数在数组初始化时已经确定下来,程序中访问数组元素时,不能超过数组的长度。系统根据length值来检查数组下标表达式,如果超出这个值,则将导致该异常。见下例。例7-5 数组下标越界 class ArrayOut public static void main(String args) int aArray = new int3; a

13、Array3 = 0;/数组下标只能是0、1、2 JAVA语言中的异常公共异常公共异常(3) IncompatibleClassChangeException异常。这是类不兼容异常。当修改一个类的定义后,引用该类的其它类没有重新编译,就会产生该异常。对应的情况有以下两类: 一个类中的变量声明由静态变成非静态,或由非静态变成静态,而其它访问该类这一变量的类没有被重新编译。 类中声明的某个域或是某个方法被删除,而其它访问该域或该方法的类没有被重新编译。(4) IncompatibleTypeException异常。这是类型不兼容异常。名字虽然与前一个异常很类似,但含义不相同。如果试图定义一个接口的

14、实例,则会引发IncompatibleTypeException异常。JAVA语言中的异常公共异常公共异常(5) NegativeArraySizeException异常。这是数组元素个数为负异常。数组长度应该是一个大于等于0的整数,所以定义数组时,方括号中的数不能写负数。当然,如果定义一个元素个数为零的数组是没有使用价值的,所以也应该避免。创建数组时,如果指定的元素个数是个负数,则会引发该异常。例7-6 引发数组元素个数为负异常示例 class NegArray public static void main(String args) int aVar = new int-1;/数组元素个数

15、不能是负数 aVar0 = 0; JAVA语言中的异常公共异常公共异常(6) NoClassDefFoundException异常。这是类未定义异常。如果一个类被引用,但在运行时,系统没有找到被引用的类,就会引发该异常。 例如,声明一个NoClass类,其中用到了另一个类anotherClass,但系统找不到这个类,引发类未定义异常。例7-7 类未定义异常示例 class NoClass public static void main(String args) anotherClass aCVar = new anotherClass(); JAVA语言中的异常公共异常公共异常(7) Null

16、PointerException异常。这是空指针异常。如果一个对象的值是null,而程序试图访问它的变量或方法,或者访问一个空数组中的元素时,都将导致该异常。看下面的例子。例7-8 引发空指针异常示例 class NullObject public static void main(String args) String oString = null;/空串 int aArray = null;/空数组 oString.length();/不能访问空串的方法 aArray0 = 0;/不能访问空数组的元素 程序中创建了两个对象,分别是空字符串和没有初始化的数组。对它们的访问都会导致空指针异常。

17、JAVA语言中的异常公共异常公共异常(8) OutOfMemoryException异常。这是内存溢出异常。当系统无法再向应用程序提供内存时,会引发该异常。这种异常只能出现在创建新对象的时候,即new被调用的时候。 例7-9 引发内存溢出异常示例 class Link int a = new int1000000; Link l; class NullObject public static void main(String args) Link root = new Link(); Link cur = root; while(true)/死循环 cur.l = new Link();/总在

18、申请内存 cur = cur.l; JAVA语言中的异常公共异常公共异常(9) SecurityException异常。这是安全方面的异常,一般在浏览器内抛出。若Java小程序试图进行不安全的操作时,则由SecurityManager类抛出此异常。 除此之外,还有下列常见异常:(10) ArrayStoreException(数组存取异常) 程序试图存取数组中错误的数据类型。(11) (文件不存在异常) 试图存取一个并不存在的文件。(12) IOException(I/O异常) 通常的I/O错误。JAVA语言中的异常抛出语句抛出语句 程序员处理异常有两种方法。一是在异常发生的位置处立即处理,即

19、使用try语句将可能出现异常的语句块括住并预先估计可能会发生的异常类,紧接其后使用catch语句对这些异常类进行相应的处理。另一种方法是,程序员不在发生异常的当前方法内处理异常,而是把异常抛出到调用方法中。抛出的语句格式如下:访问权限修饰符 返回值类型 方法名 (参数列表) throws 异常列表紧接在关键字throws后面的是该方法内可能发生且不进行处理的所有异常列表。抛出的异常可以有多个,各异常之间以逗号分隔。JAVA语言中的异常父类子类异常处理示例父类子类异常处理示例例7-10 父类子类异常处理示例 import java.io.*; class Base/父类 public stati

20、c void amethod() throws public class ExcepDemo extends Base/子类 /抛出的异常不同于父类同名方法抛出的异常,也不是它的子类 /编译出错 public static void amethod() throws IOException 因为在父类中抛出的异常是,它是IOException异常的子类,所以上面的代码不能被编译。如果互换例7-10中抛出的两个异常,即在父类中抛出IOException异常,在子类中的方法抛出,此时代码正确。JAVA语言中的异常捕获的错误示例捕获的错误示例捕获多个异常时,异常类的派生关系也需要注意。应该先捕获特殊

21、的异常,即异常子类,然后才能捕获更一般的异常,即异常父类。 下面的代码是错误的: try DataInputStream dis = new DataInputStream(System.in); dis.read(); catch (Exception ioe)/一般异常 catch (IOException e ) /编译错误! finallyJAVA语言中的异常捕获异常捕获异常程序中,有些语句必须要捕获异常,而有些由系统自动完成。I/O操作必须捕获异常,遍历数组元素时不需要由程序员控制,系统自动对数组做检查。另外,捕获异常的语句一般出现在可能发生异常的代码段,而不应该放到控制程序执行的语

22、句段。JAVA语言中的异常捕获异常捕获异常程序7-6 I/O操作必须捕获异常 import java.io.*; public class public static void main(String args) try fr = new (); catch(Exception e) System.out.println(e.getMessage(); 在当前目录下查找文件,如果找不到,则显示一条错误信息。JAVA语言中的异常创建自己的异常创建自己的异常 系统虽然已经定义了公共异常类,但这些往往还不能满足实际需要。编制程序中,除了使用系统预定义的异常外,用户还可以创建自己的异常。自己定义异常类

23、时,必须从已有的异常类来继承,所以用户自定义的所有异常类都必须间接或直接的是Exception的子类。JAVA语言中的异常创建异常示例创建异常示例程序7-7定义自己的异常 class MyException extends Exception private int detail; MyException (int aExcep) detail = aExcep; public String toString() return MyException + detail + ; class ExceptionDemo static void compute (int aExcep)throws

24、MyException System.out.println(Called compute ( + aExcep + .); if (aExcep 10) throw new MyException (aExcep); System.out.println(Normal exit); public static void main(String args) try compute(1); compute(20); catch (MyException eExcep) System.out.println(Exception caught + eExcep); JAVA语言中的异常自定义异常示例

25、自定义异常示例客户端程序尝试与服务器连接,并期待服务器在5秒内作出响应。如果服务器没有响应,则客户端抛出一个异常。程序中定义新的异常类,并在这个异常类中显示相关信息。例7-12 自定义异常 public void connectMe(String servename) throws ServerTimedOutException int success; int portToConnect = 80; /端口号 success = open(serveName, portToConnect); if (success = -1) throw new ServerTimedOutExceptio

26、n(); JAVA语言中的异常自定义异常示例自定义异常示例使用try语句可捕获该异常: public void findServer () . try connectMe(defaultServer); catch(ServerTimedOutException e) g.drawString(Server timed out, trying alternate, 5, 5); try connectMe(alternateServer); catch(ServerTimedOutException e1) g.drawString(No server currently available, 5, 5); . JAVA语言中的异常JAVA程序设计程序设计人民邮电出版社人民邮电出版社

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

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