版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA程序设计程序设计人民邮电出版社人民邮电出版社第第7章章 JAVA言语中的异常言语中的异常异常异常 编写程序时多多少少总会有些错误,程序中的语法错误解在编译时被发现并修正,而有些错误是发生在运转阶段的。这些错误按照其严重程度分为两类,一类是致命性的严重错误,它们的出现能够会导致系统解体,并且程序员并不能编写程序处理所出现的问题。另一类是普通级别的错误,这类错误假设不加控制就使程序非正常中断,但假设编写代码来处置的话,就有能够防止中断程序的执行。这类错误普通地称为异常Exception,用来处置异常的过程称为异常处置。异常异常在Java中主要有三类异常。现实上,Java定义了类java.l
2、ang.Throwable,它是运用异常处置机制可被抛出并捕获的一切异常对象的父类。它有三个根本子类,如以下图: 异常异常每个类的运用目的不同。Error表示很难恢复的错误。普通不期望用户程序来处置,即使程序员有才干处置这种错误,也还是交给系统处置为好。RuntimeException用来表示设计或实现方面的问题。由于设计和实现正确的程序不会引发这类异常,所以经常不处置它。发生这类异常时,运转时环境会输出一条信息,提示用户修正错误。其他异常表示运转时因环境的影响能够发生并可被处置的问题。由于用户的错误很能够导致这类问题发生,我们要学习的是如何处置这类异常。异常例如异常例如 例7-1 文件操作功
3、能描画 openTheFile;/翻开文件 determine its size;/获取文件的长度 allocate that much memory;/分配内存 read-file;/读文件 closeTheFile;/封锁文件 实现文件读取的程序大多有上述这样的程序框架。由于文件存放在外存,程序要访问文件时必需先要将文件放入内存然后才干访问。这段程序是顺序执行构造,而前一句执行的结果又直接影响后一句能否能执行。假设中间哪一条语句执行不正确,后续语句都不能正确执行,程序也会中断。所以凡是有输入输出操作的语句都能够会出现问题。异常例如异常例如例7-2 添加了约束的文件操作功能描画openFil
4、es; /翻开文件 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(memoryAllo
7、cateFailed) /内存分配失败的处置代码; 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异常时要执行的代码 final
9、ly / 必需执行的代码 其中,ExceptionType1,ExceptionType2,ExceptionTypek是产生的异常类型。根据发生异常所属的类,找到对应的catch语句,然后执行后面的语句序列。Finally语句语句异常处置中有一个特殊的语句,即finally语句。它是最后一条语句,Java规定,不论能否捕获到异常,总要执行finally后面的语句。即使try块中包含return、break、continue、throw等语句,finally语句也会被执行。finally语句不执行的情况只需一种,即在维护代码内执行了System.exit()方法后,将不再执行finally后面
10、的语句,这是不执行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 (String args) int
11、 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) ArrayIndexOutOfBound
12、sException异常。这是数组下标越界异常。数组元素的个数在数组初始化时曾经确定下来,程序中访问数组元素时,不能超越数组的长度。系统根据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类,其中用到
15、了另一个类anotherClass,但系统找不到这个类,引发类未定义异常。例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
16、(String args) String oString = null;/空串 int aArray = null;/空数组 oString.length();/不能访问空串的方法 aArray0 = 0;/不能访问空数组的元素 程序中创建了两个对象,分别是空字符串和没有初始化的数组。对它们的访问都会导致空指针异常。公共异常公共异常(8) OutOfMemoryException异常。这是内存溢出异常。当系统无法再向运用程序提供内存时,会引发该异常。这种异常只能出如今创建新对象的时候,即new被调用的时候。 例7-9 引发内存溢出异常例如 class Link int a = new int1
17、000000; 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) ArrayStoreExcep
18、tion数组存取异常 程序试图存取数组中错误的数据类型。(11) FileNotFoundException文件不存在异常 试图存取一个并不存在的文件。(12) IOExceptionI/O异常 通常的I/O错误。抛出语句抛出语句 程序员处置异常有两种方法。一是在异常发生的位置处立刻处置,即使用try语句将能够出现异常的语句块括住并预先估计能够会发生的异常类,紧接其后运用catch语句对这些异常类进展相应的处置。另一种方法是,程序员不在发生异常的当前方法内处置异常,而是把异常抛出到调用方法中。抛出的语句格式如下:访问权限修饰符 前往值类型 方法名 (参数列表) throws 异常列表紧接在关键
19、字throws后面的是该方法内能够发生且不进展处置的一切异常列表。抛出的异常可以有多个,各异常之间以逗号分隔。父类子类异常处置例如父类子类异常处置例如例7-10 父类子类异常处置例如 import java.io.*; class Base/父类 public static void amethod() throws FileNotFoundException public class ExcepDemo extends Base/子类 /抛出的异常不同于父类同名方法抛出的异常,也不是它的子类 /编译出错 public static void amethod() throws IOExcept
20、ion 由于在父类中抛出的异常是FileNotFoundException,它是IOException异常的子类,所以上面的代码不能被编译。假设互换例7-10中抛出的两个异常,即在父类中抛出IOException异常,在子类中的方法抛出FileNotFoundException,此时代码正确。捕获的错误例如捕获的错误例如捕获多个异常时,异常类的派生关系也需求留意。应该先捕获特殊的异常,即异常子类,然后才干捕获更普通的异常,即异常父类。 下面的代码是错误的: try DataInputStream dis = new DataInputStream(System.in); dis.read();
21、 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 FileReader
22、fr = new FileReader(FileOut.java); catch(Exception e) System.out.println(e.getMessage(); 在当前目录下查找文件FileOut.java,假设找不到,那么显示一条错误信息。创建本人的异常创建本人的异常 系统虽然曾经定义了公共异常类,但这些往往还不能满足实践需求。编制程序中,除了运用系统预定义的异常外,用户还可以创建本人的异常。本人定义异常类时,必需从已有的异常类来承继,所以用户自定义的一切异常类都必需间接或直接的是Exception的子类。创建异常例如创建异常例如程序7-7定义本人的异常 class MyEx
23、ception 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 new MyException (aExcep); System.out.println(Normal exit); pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 月嫂家政服务合同签订与风险防范
- 建筑模板工程分包施工合同
- 简易活动房安装合同书范本
- 专业采购合同书样
- 互联网融资居间合同
- 低碳晶板采购合同
- 抵押借款合同纠纷的诉讼途径
- 公司借款合同协议书示例
- 高新技术产业创新平台搭建计划
- 企业内部通讯系统使用及维护合同
- 电力行业电力调度培训
- 生态安全与国家安全
- 全力以赴备战期末-2024-2025学年上学期备战期末考试主题班会课件
- 2024年保密协议书(政府机关)3篇
- 《视频拍摄与制作:短视频 商品视频 直播视频(第2版)》-课程标准
- 研发部年终总结和规划
- 石油开采技术服务支持合同
- 山东省烟台市2024届高三上学期期末考试英语试题 含解析
- 公司战略与风险管理战略实施
- 2024年-2025年《农作物生产技术》综合知识考试题库及答案
- 广东省广州市白云区2022-2023学年八年级上学期物理期末试卷(含答案)
评论
0/150
提交评论