




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 6章 Java异常处理Java程序设计基础贾宇波 孙麒 沈静 徐春霞人民邮电出版社本章主要内容n 异常 简介n Java异常处理 机制n 抛出和声明 异常n 捕捉异常n 使用用户自定义 异常第 6章 Java异常处理一个程序在编译时没有错误信息产生,而在运行过程有时会出现一些意外的情况导致程序退出, Java语言称之为异常( Exception)。对于计算机程序来说,异常都是不可避免的。 Java内置的异常处理机制可较好地对这些异常进行处理,保证程序的安全运行。n 没有错误处理的程序 :open the file;determine its size;allocate that much memory;read the file;close the file; 6.1 Java异常简介6.1.1 引入异常n以常规方法处理错误 :openFiles;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;else errorCode=-3;else errorCode=-4 ;else errorCode=-5; 6.1 Java异常简介6.1.1 引入异常n 观察前面的程序,大家会发现大部分精力花在出错处理上了n 只把能够想到的错误考虑到,对以外的情况无法处理n 程序可读性差n 出错返回信息量太少6.1 Java异常简介6.1.1 引入异常n用 Java的 trycatch 异常处理机制处理 :tryopen the file;determine its size;allocate that much memory;read the file;close the file;catch(fileOpenFailed) dosomething; catch(sizeDetermineFailed) dosomething; catch(memoryAllocateFailed) dosomething; catch(readFailed) dosomething; catch(fileCloseFailed) dosomething; 6.1 Java异常简介6.1.1 引入异常Java通过面向对象的方法来处理程序错误。一个异常是由一个对象来表示,所有的异常都直接或间接地继承自 Throwable接口。Java所有的异常对象都是一个继承 Throwable接口的实例。 Throwable接口是类库 java.lang包中的一个类,它派生了两个子类: Error和 Exception。6.1.2 异常类层次结构图 6-1 Java中异常 类 的 层 次 结 构1. Error类Error类及其子类主要用来描述一些 Java运行时刻系统内部的错误或资源枯竭导致的错误,普通的程序不能从这类错误中恢复。此类型的错误不能抛出,而且出现的几率是很小的。6.1.2 异常类层次结构2. Exception类(1) RuntimeException异常 这类异常属于程序缺陷异常,是设计或实现上的问题。RuntimeException可以不使用 trycatch进行处理,此这类异常也被称为非受检异常( unchecked exception),但是如果有异常产生,则异常由 JVM处理,程序中断执行,所以保证程序在出错后依然可以执行,在开发时还是最好使用 trycatch处理。 常见的 RuntimeException异常如ArrayIndexOutOfBandsException、 ArithmeticException和NumberFormatException等。(2) 非 RuntimeException异常 这类异常一般是程序外部问题引起的异常。这类异常在语法上要求必须处理,如果不处理将会出现语法错误,不能通过编译,这类异常称为受检异常( checked exception),如FileNotFoundException、 IOException等 。6.1.2 异常类层次结构2. Exception类表 6-1 Exception类的常用方法6.1.2 异常类层次结构所有异常类都继承于 Exception类,这些异常类各自代表了一种特定的错误。这些子类有些是系统事先定义好并包含在 Java类库中的,对应着一个系统运行错误,有时称为系统定义异常。表 6-2 部分常用异常类6.1.3 常用异常类系统定义的异常主要用来处理系统可以预见的较常见的运行错误,对于某个特定的应用程序所特有的运行错误,则需要编程人员根据程序的特殊逻辑在用户程序里自己创建用户自定义的异常类和异常对象。这种用户自定义异常主要用来处理用户程序中特定的逻辑运行错误。自定义异常必须继承自 Throwable或 Exception类 , 用户自定义的异常建议采用 Exception作为异常类的父类, 自定义异常的格式如下 :class MyException extends Exception /自定义的异常类子类 MyExceptionpublic MyException() /用户异常的构造函数public MyException(String s) super(s); /调用父类的 Exception的构造函数public String toString() /重载父类的方法,给出详细的错误信息6.1.4 自定义异常类Java程序在运行时如果引发了一个可以识别的错误,就会产生一个与该错误相对应的异常类的对象,这个过程叫做异常的抛出。抛出的是相应异常类对象的实例。根据异常类的不同,抛出异常的方式也有所不同。所有系统定义的运行异常都可以由系统自动抛出,而用户程序自定义的异常不可能依靠系统自动抛出必须通 throw语句实现。语法格式如下:修饰符 返回类型 方法名(参数列表) throws 异常类名列表 /声明异常throw 异常类名; /抛出异常6.2 Java异常处理机制6.2.1 抛出和声明异常既然 throws是在方法处定义的,那么 main方法也可以使用throws关键字,但是 main方法为程序的起点,所以此时再上向抛出异常,则只能将异常抛给 JVM处理,将导致程序的中断,见例 6.3。【例 6.3】 main方法使用 throws关键字。public class MainThrowsDemo/ 在主方法中的所有异常都可以不使用 try.catch进行处理public static void main(String args) throws ExceptionMath m = new Math() ; System.out.println(“除法操作: “ + m.div(5,0); /调用除法计算方法6.2.1 抛出和声明异常当一个异常被抛出时, Java中有专门的语句来接收这个被抛出的异常对象,这个过程被称为 捕捉异常 。Java语言提供了 trycatchfinally机制来捕捉一个或多个异常,并进行处理,具体格式如下所示:try /接受监视的程序块 ,在此区域内发生/的异常 ,由 catch中指定的程序处理 ;catch(异常类名 1 异常形式参数名 )/处理异常 ;catch(异常类名 2 异常形式参数名 )/处理异常 ;finally/最终处理,每次执行的代码 ;6.2.2 捕捉异常6.2.2 捕捉异常图 6-2 Java异常 处 理流程1. try语句在 try程序块中可以包含任意条语句,而且其中至少有一条语句可能会产生异常。在 try程序块中产生三种情况:(1) try程序块中的指令都成功执行;(2) 在 try程序块中产生一个异常,程序跳出 try块,并且找到该异常匹配的 catch程序块;(3) 在 try程序块中产生一个异常,程序跳出 try块,但未找到与该异常匹配的 catch程序块,因此方法再次抛出该异常。6.2.2 捕捉异常2. catch语句每个 try语句必须伴随一个或多个 catch语句,用于捕获 try代码块所产生的异常并做相应的处理,而且多个 catch语句之间可以交换顺序。 catch语句有一个形式参数,用于指明其所能捕获的异常类型,运行时系统通过参数是否和抛出的异常对象是否匹配来捕捉异常。参数匹配,满足下面三个条件任何一种,异常对象被接收:(1) 异常对象与参数属于相同异常类;(2) 异常对象属于参数异常类的子类;(3) 异常对象实现了参数异常类所定义的接口。6.2.2 捕捉异常3. finally语句finally语句为异常处理提供一个统一的出口。无论 try所指定的程序块中抛出或不抛出异常,也无论 catch语句的异常类型是否与所抛出的异常类型匹配, finally所指定的代码都要被执行,它提供了统一的出口。通常在 finally语句中可以进行资源的清除工作,如关闭打开的文件和关闭数据流等。6.2.2 捕捉异常当我们在设计自己的类包时,应尽最大的努力为用户提供最好的服务,并且希望用户不要滥用我们所提供的方法,当程序出现某些异常事件时,我们希望程序足够健壮,这时就需要用到异常机制。在选择异常类型时,可以使用 Java类库中已经定义好的类,也可以自己定义异常类。当自定义异常是从 RuntimeException及其子类继承而来时,程序中可以不捕捉并处理它。当自定义异常是从 Exception及其其他子类继承而来时,该自定义异常在程序中必须捕捉并处理它,那么自定义异常不仅要用 try-catch-finally捕获,还必须由用户自己定义和抛出,一般流程如图 6-3所示。6.3 使用用户自定义异常定 义 异常 抛出异常 捕捉异常图 6-3 定 义 和使用自定 义 异常流程【例 6.5】计算两个数之和,当任意一个数超出范围时,抛出自己的异常。第一步,定义 NumberRangeException异常类: class NumberRangeException extends Exceptionpublic NumberRangeException(String msg) super(msg);6.3 使用用户自定义异常第二步,定义一个计算两数和的方法 CalcAnswer(),当操作的数不是在10和 20之间时,抛出 NumberRangeException异常:public int CalcAnswer(String str1, String str2) throws NumberRangeException int int1, int2;int answer = -1;tryint1 = Integer.parseInt(str1);int2 = Integer.parseInt(str2);if( (int1 20) | (int2 20) )/判断范围NumberRangeException e = new NumberRangeException(“Numbers not within the specified range.“);throw e; /抛出 NumberRangeException异常对象answer = int1 + int2; /没有异常发生,计算两数之和catch (NumberFormatException e)System.out.println( e.toString() ); /输出异常信息return answer;6.3 使用用户自定义异常【例 6.6】在定义银行类时,若取钱数大于余额则作为异常处理。第一步,定义 InsufficientFundsException异常类:class InsufficientFundsException extends Exceptionprivate Bank excepbank; /银行帐户private double excepAmount; /余额InsufficientFundsException(Bank ba, double dAmount) excepbank = ba;excepAmount = dAmount;System.out.println(this.excepMesagge().toString(); public String excepMesagge() /异常信息定义String str = “The balance “ + excepbank.getbalance() +“n“+“The withdrawal was “+excepAmount;return str; 6.3 使用用户自定义异常第二步,定义一个银行类。在取钱方法 withdrawal()中,当余额不足时,抛出InsufficientFundsException异常对象 。class Bankdouble balance; /余额 Bank(double bala) /帐户初始化this.balance=bala; public void deposite(double dAmount) /存钱if(dAmount0.0) balance += dAmount; public void withdrawal(double dAmount) throws InsufficientFundsException /取钱if( balance dAmount ) /余额不够throw new InsufficientFundsException(this, dAmount); /抛出异常 balance = balance-dAmount; /余额足够,取钱 public double getbalance() /读取余额return balance; 6.3 使用用户自定义异常第三步,模拟取钱。若原有银行账户中有 50元,现取钱 100元,则余额不够,捕捉InsufficientFundsException异常对象 。public class InsufficientFundsExceptionDemo p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 竞价考试题及答案
- 画室考试题及答案
- 编码考试题及答案
- 职业危害及防护措施试题含答案
- 中级宏观经济学(浙江大学)知到智慧树答案
- 成人住院患者跌倒风险评估及预防考核试题及答案
- 中药药剂学考试模拟题(附答案)
- 血透室进修护士出科理论考试卷含答案
- 中学生物课程教学设计知到智慧树答案
- 财务杠杆效应分析-洞察及研究
- T-SZEIA 001-2024 温室气体产品碳足迹量化方法与要求 变电站电气设备
- 全脑课程理论知识
- 餐饮公司应聘简历
- 牢记教师初心不忘育人使命作新时代合格人民教师课件
- 一科一品一特色护理妇产科
- 《老年照护芳香疗法应用规范》标准文本及编制说明
- 2024-年全国医学博士外语统一入学考试英语试题
- 冶金渣公司安全生产委员会工作职责
- 老年患者护理心理护理
- 项目担保合作协议范本
- 2024-2025学年湖南省“炎德·英才·名校联考联合体”高二第一次联考(暨入学检测)数学试题(含答案)
评论
0/150
提交评论