




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java程序设计 Programming in Java,谷勇浩 北京邮电大学 计算机学院 ,第 6 章 异常处理,异常处理方法的好处,异常处理方法是一种非常有用的辅助性程序设计方法。 采用该方法可以将程序的正常流程与错误处理分开,有利于代码的编写与维护。 异常处理方法具有统一的模式,简化了程序的设计。,Java 异常处理(Exception)基础,异常(Exception)? 异常(Exception)是正常程序流程所不能处理或没有处理的异常情况或异常事件。 在有些书中,异常也称作例外。,异常处理基础,强制程序异常/错误处理 同时指定需要异常的种类 异常处理模型提供了一种统一处理异常/错误的模式 传统程序方法: 设置标志位,或返回错误码,分别处理各种异常情况。但在编程时常常出现这样的情况:忘了对某些异常情况进行处理,尤其是当存在多个分支或者多个开发人员共同开发程序时。 简化对异常情况的处理,减少if-else语句,什么时候会发生异常?,数组/字符序列的下标越界 少了所需加载的类 网络无法连接 操作数超出所要求的范围 打开不存在的文件 自定义异常,要求程序处理,常见异常,常见异常 内存耗尽 数组下标越界 除数为0 非法的参数(方法的参数),异常(Exceptions)类型,按照异常在编译时是否被检测,分为两种异常: 受检异常(Checked Exception) 在编译时就能被检测出 必须在自定义方法声明时通过throws列出 非受检测异常(Unchecked Exception) 不能在编译时被检测到 不必在throws列表中 错误(Errors) 和运行时异常(RuntimeExceptions) 受检异常,必须处理才能通过编译 运行时异常只有在运行时才能被发现,如除数为0,异常(Exception)的层次结构,异常是以类的形式进行封装,程序可处理异常对应类Exception及其子类,错误异常对应类Error及其子类,运行异常对应类RuntimeException及其子类,除RuntimeException外, Exception的其他子类为受检异常对应类(如,ClassNotFoundException、IOException),运行时发生的异常(RuntimeExceptions),异常随时都可以发生 ArrayIndexOutOfBoundsException 数组元素下标越界 NullPointerException 定义了引用,但不指向任何对象(object) ClassCastException 数据类型间的转换不合法 良好的编程习惯,可以减少很多异常的发生,异常例程,除数为0的异常例程 J_ExceptionByZero.java 输出结果及说明 a=10 b=0 Exception in thread “main” java.lang.ArithmeticException: / by zero at J_ExceptionByZero.main(J_ExceptionByZero.java:18) 说明:该异常类型为java.lang.ArithmeticException,它是RuntimeException类的子类,即是一种运行时异常。,异常产生,异常可以由虚拟机在执行程序时自动发现并产生,也可以在程序中显示生成。这种显示生成异常的方法称为抛出异常。 抛出异常是通过throw语句实现,格式如下: throw java.lang.Throwable类型(或其子类)的变量; 例, throw new ArithmeticException(); 或 ArithmeticException e = new ArithmeticException(); throw e; 注意:抛出的异常只能是Throwable类型或其子类的对象。 throw new String(“Exception”); 错误。因为String类是Object的子类,不是Throwable的子类,不符合throw语句的语法。,异常处理,一旦捕获异常,马上进行处理 重新抛出异常 捕获异常,但并不处理 通过语句System.exit()退出应用程序,异常处理,一个完整而实用的程序必须能处理受检异常(Checked Exception)与运行时异常(Runtime Exception)。 处理异常的方式 捕捉异常 转移异常,捕捉异常的格式(try-catch-finally),在try语句块中包含可能会产生异常的语句 紧接着若干个catch语句块,进行异常处理,ExceptionType的类型必须为Throwable类或其子类 catch语句块与finally语句块至少存在一个,try / 可能会抛出异常的代码 catch (ExceptionType ref) / 异常处理代码 / 其他catch语句块 finally / ,处理多种异常(Exception),当try语句块有异常发生时,中断try语句块剩余语句的执行,并产生该异常所对应的实例对象。 该异常实例对象依次匹配在各个catch语句块中的类型ExceptionType,匹配成功后进入相应的catch语句块执行。 在try-catch-finally结构中,finally语句块一般总会执行,不管有没有异常产生。 如果try语句块或catch语句块中有return语句,先执行finally语句块,再执行该return语句。 如果执行到try语句块或catch语句块中的语句“System.exit(0)”,则直接退出程序,不执行finally语句块。,finally 语句块,在异常处理过程中,finally 语句块一般会被执行到: 无论有没有异常发生,也无论有没有异常被捕捉到,除非强行退出程序(System.exit(0))。 可以用来释放try语句块中获得的资源 例如,关闭在try语句块中打开的文件,异常捕捉例程,J_ExceptionCatch.java 输出结果 try语句块 catch语句块 Java.lang.Exception at J_ExceptionCatch.main(J_ExceptionCatch.java:17) finally语句块 例程说明 通过Exception类的变量e调用Throwable类的成员方法public void printStackTrace() 该方法通过标准错误输出流(System.err)在控制台上输出异常的类型以及异常发生的方法调用堆栈跟踪信息 例如,在输出结果中列出的main成员方法以及产生异常的行号等。,异常捕捉结构注意事项,编写异常处理的代码之前,要先阅读API文档,对异常类型有个清楚的认识。 try-catch-finally结构中,三个语句块之间不能包含其他语句。 每个catch语句块只能有一个异常参数,不能写两个或两个以上的异常参数,更不能写其他类型的参数。 当程序中存在多个catch语句块时,把包含子类型异常的catch语句块放在前面,把包含父类型异常的catch语句块放在后面。 由于子类对象也是父类的对象,如果颠倒相应catch语句块的先后次序,则可能产生需要执行子类语句块但执行了父类语句块。,异常捕捉结构注意事项,catch语句块捕获异常的匹配规则 抛出异常对象与catch子句参数类型相同 抛出异常对象为catch子句参数类的子类 按照先后次序捕获抛出异常对象,只捕获一次 catch语句块编码建议 多个catch子句需要按异常从子类到父类的次序依次排列。 通常最后一个catch语句块的异常类参数声明为Exception,这样能够保证捕获和处理所有异常对象。,转移异常方式,在处理受检异常时,可以将可能发生的受检异常转移到上层调用该成员方法的方法处。 示例: public static void mb_throwException( ) throw new Exception( ); /上面的成员方法将产生编译错误,因为Java虚拟机要求上面的成员方法处理语句throw new Exception()产生的异常。可用转移异常方式解决,即采用throws列表方式。,throws 列表,转移异常的格式 方法修饰词列表返回类型 方法名( 参数列表 ) throws 异常类型1, 异常类型2, / 方法体 在方法的声明处列出所有需要转移的受检异常类型 在本方法内就可以不处理这些异常 调用该方法的方法就必须处理这些异常或继续向上层方法转移,直到被catch语句块捕捉到,才算彻底处理该异常。 示例: public static void g( ) throws Exception throw new Exception( ); / 方法g结束,重新抛出异常,如果catch语句块不处理某种异常,可以重新抛出异常 抛出异常的方法: throw e; 由其外层的try- catch 语句块处理,异常处理例程,J_Exception.java 输出结果 产生并抛出ArithmeticException类型的异常 方法mb_catchArrayException的finally语句块 方法main捕捉到异常 方法main的finally语句块 异常处理结束,异常处理例程,例程说明 如果成员方法中产生的异常是运行时异常,则该成员方法不用“throws”关键字声明转移异常。 抛出的异常类型只有找到类型匹配的catch语句块时,才执行catch语句块中以及try-catch-finally结构之后的内容。 在try-catch-finally结构中,产生的异常类型与catch类型不匹配时也要执行finally语句块中的内容。 抛出的异常一定要处理,处理后顺序执行后续程序。,自定义异常类型,例程 J_ExceptionNewExample.java 例程说明
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年《劳动关系协调员》考试模拟练习题(附参考答案)
- 综合效应量化方法研究-洞察与解读
- 虚拟社交技能训练-洞察与解读
- 2025年劳务员基础(劳务员)新试题库附答案
- 2025年事业单位招聘考试电子商务类综合专业能力测试试卷:真题模拟详解
- 2025年事业单位面试真题模拟试卷:面试考前押题卷与心理调适
- 福州事业单位招聘考试综合类职业能力倾向测验真题模拟试卷
- 红外线护理考试题及答案
- 赫贤入学考试题目及答案
- 培训项目衰退期风险防控-洞察与解读
- 自备车补贴申请表
- 信息论与编码(第4版)完整全套课件
- 汽修厂安全风险分级管控清单
- GB/T 2679.7-2005纸板戳穿强度的测定
- GB/T 25840-2010规定电气设备部件(特别是接线端子)允许温升的导则
- GB/T 25146-2010工业设备化学清洗质量验收规范
- 参考资深同传
- 多功能注氧仪说明书课件
- 科隆电磁流量计培训课件
- 全集举一反三课件奥数五年级(数学)
- 中国民间故事整本书导读课教学设计
评论
0/150
提交评论