第07章JAVA语言中的异常

上传人:仙*** 文档编号:48594428 上传时间:2022-01-12 格式:PPT 页数:33 大小:274.50KB
收藏 版权申诉 举报 下载
第07章JAVA语言中的异常_第1页
第1页 / 共33页
第07章JAVA语言中的异常_第2页
第2页 / 共33页
第07章JAVA语言中的异常_第3页
第3页 / 共33页
资源描述:

《第07章JAVA语言中的异常》由会员分享,可在线阅读,更多相关《第07章JAVA语言中的异常(33页珍藏版)》请在装配图网上搜索。

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

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

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

4、les; /打开文件 if (theFilesOpen)/判定打开是否正确 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

5、=-3; /内存分配不成功 else errorCode=-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(memo

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

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

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

10、nally后面的语句,这是不执行finally后面语句的惟一一种可能。 公共处理示例公共处理示例例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 (Stri

11、ng args) int aVar = 0; try if(aVar = 10) return; finally System.out.println(finally); System.out.println(aftertry); 公共异常公共异常 (1) ArithmeticException异常。进行表达式计算时,除数不能为零。当程序中出现除数为零,或在整数运算中对零取模时,就会发生该类异常。如下面表达式将引发ArithmeticException异常: int i = 12 / 0;/除数为0 float avar = 12 % 0;/对0取模公共异常公共异常 (2) ArrayInde

12、xOutOfBoundsException异常。这是数组下标越界异常。数组元素的个数在数组初始化时已经确定下来,程序中访问数组元素时,不能超过数组的长度。系统根据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异常。这是类未定义异常。如果一个类被引用,但在运行时,系统没有找到被引用的类,就会引发该异常。 例如,声明一个NoCla

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

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

17、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();/总在申请内存 cur = cur.l; 公共异常公共异常(9) SecurityException异常。这是安全方面的异常,一般在浏览器内抛出。若Java小程序试图进行不安全的操作时,则由SecurityManager类抛出此异常。 除此之外,还有下列常见异常:(10) ArrayStor

18、eException(数组存取异常) 程序试图存取数组中错误的数据类型。(11) FileNotFoundException(文件不存在异常) 试图存取一个并不存在的文件。(12) IOException(I/O异常) 通常的I/O错误。抛出语句抛出语句 程序员处理异常有两种方法。一是在异常发生的位置处立即处理,即使用try语句将可能出现异常的语句块括住并预先估计可能会发生的异常类,紧接其后使用catch语句对这些异常类进行相应的处理。另一种方法是,程序员不在发生异常的当前方法内处理异常,而是把异常抛出到调用方法中。抛出的语句格式如下:访问权限修饰符 返回值类型 方法名 (参数列表) thro

19、ws 异常列表紧接在关键字throws后面的是该方法内可能发生且不进行处理的所有异常列表。抛出的异常可以有多个,各异常之间以逗号分隔。父类子类异常处理示例父类子类异常处理示例例7-10 父类子类异常处理示例 import java.io.*; class Base/父类 public static void amethod() throws FileNotFoundException public class ExcepDemo extends Base/子类 /抛出的异常不同于父类同名方法抛出的异常,也不是它的子类 /编译出错 public static void amethod() thr

20、ows IOException 因为在父类中抛出的异常是FileNotFoundException,它是IOException异常的子类,所以上面的代码不能被编译。如果互换例7-10中抛出的两个异常,即在父类中抛出IOException异常,在子类中的方法抛出FileNotFoundException,此时代码正确。捕获的错误示例捕获的错误示例捕获多个异常时,异常类的派生关系也需要注意。应该先捕获特殊的异常,即异常子类,然后才能捕获更一般的异常,即异常父类。 下面的代码是错误的: try DataInputStream dis = new DataInputStream(System.in);

21、 dis.read(); catch (Exception ioe)/一般异常 catch (IOException e ) /编译错误! finally捕获异常捕获异常程序中,有些语句必须要捕获异常,而有些由系统自动完成。I/O操作必须捕获异常,遍历数组元素时不需要由程序员控制,系统自动对数组做检查。另外,捕获异常的语句一般出现在可能发生异常的代码段,而不应该放到控制程序执行的语句段。捕获异常捕获异常程序7-6 I/O操作必须捕获异常 import java.io.*; public class FileOut public static void main(String args) try

22、 FileReader fr = new FileReader(FileOut.java); catch(Exception e) System.out.println(e.getMessage(); 在当前目录下查找文件FileOut.java,如果找不到,则显示一条错误信息。创建自己的异常创建自己的异常 系统虽然已经定义了公共异常类,但这些往往还不能满足实际需要。编制程序中,除了使用系统预定义的异常外,用户还可以创建自己的异常。自己定义异常类时,必须从已有的异常类来继承,所以用户自定义的所有异常类都必须间接或直接的是Exception的子类。创建异常示例创建异常示例程序7-7定义自己的异常

23、 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 MyException System.out.println(Called compute ( + aExcep + .); if (aExcep 10) throw n

24、ew 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); 自定义异常示例自定义异常示例客户端程序尝试与服务器连接,并期待服务器在5秒内作出响应。如果服务器没有响应,则客户端抛出一个异常。程序中定义新的异常类,并在这个异常类中显示相关信息。例7-12 自定义异常

25、public void connectMe(String servename) throws ServerTimedOutException int success; int portToConnect = 80; /端口号 success = open(serveName, portToConnect); if (success = -1) throw new ServerTimedOutException(); 自定义异常示例自定义异常示例使用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程序设计程序设计人民邮电出版社人民邮电出版社

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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