




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 异常处理 Java程序设计与应用开发 第2版 本节主要内容 概述异常处理异常的抛出策略异常的捕获策略 Java程序设计与应用开发 第2版 5 1概述 Java则在C 基础上建立了全新的异常处理机制 Java运用面向对象的方法进行异常处理 把各种不同的异常进行分类 并提供了良好的接口 异常是用来应对程序中可能发生的各种错误的一种强大的处理机制 要写出友好 健壮的程序 灵活地运用Java程序语言的异常处理机制 须从以下几个方面来认识异常 抛出异常 捕获异常以及处理异常 Java程序设计与应用开发 第2版 5 2异常处理 5 2 1遭遇异常在Java中 异常分为检查的 Checked 和未检查的 Unchecked 两种类型 对于Checked类型的异常 编译器要求在方法中必须捕获之或是声明之 而对于Unchecked类型的异常 编译器并不强制方法捕获或是声明 由于FileNotFoundException和IOException均属于Checked类型的异常 因而编译器会强制要求捕获之或是声明之 而ArrayIndexOutOfBoundsException属于Unchecked类型的异常 因而编译器并不会强制要求捕获该异常或是声明该异常 Java程序设计与应用开发 第2版 5 2 2捕获并处理异常 通常使用下面的代码框架来进行异常的捕获与处理 try 可能出现异常的代码 catch 捕获异常 异常处理代码 对于可能出现异常的代码 使用一个try块将其包括起来 try块中可以包含一条或是多条Java语句 Java程序设计与应用开发 第2版 一个try块可以有多个对应的catch块 用以捕获不同类型的异常 try catch ExceptionType1name1 catch ExceptionType2name2 catch子句的一般形式为 catch ExceptionTypeexceptionName catch子句中包含有唯一的参数 ExceptionTypeexceptionNameExceptionType指明了catch语句所能捕获的异常类型 ExceptionType必须是一个继承了java lang Throwable的类 当catch语句捕获一个异常时 将传递一个ExceptionType类型的对象进入catch块 该对象中包含了异常的全部信息 可以使用该对象中相应的方法获取异常信息 Java程序设计与应用开发 第2版 在catch块后 还可以跟随finally块 try catch finally 无论try块中是否出现异常 finally块中的语句总是得到执行 Java程序设计与应用开发 第2版 Java中的部分异常 Java程序设计与应用开发 第2版 Java的几个特别重要的异常类Throwable 所有异常的基类 Error Throwable的子类 代表一个严重的问题 例如 OutOfMemoryError代表JVM的堆空间耗尽 UnknownError代表Java虚拟机中出现一个未知但严重的异常 Exception Throwable的另一个子类 代表一个普通的问题 例如 FileNotFoundException代表文件未找到 SQLException代表有关JDBC的异常 RuntimeException Exception类的一个特殊的子类 可能在任何正常的操作中被抛出 例如 NullPointerException表示试图引用null对象的方法或属性 IndexOutOfBoundException表示数组越界的异常 在C语言中没有这样的特性 往往会造成严重且难以发现的程序漏洞 Java程序设计与应用开发 第2版 5 2 3声明方法抛出异常 然而 在有些情况下 仅根据当前的条件还无法处理出现的异常 这时候 就应该使用这样的方法 声明该方法会抛出异常 该方法的调用者来负责捕获异常或是继续抛出异常 声明一个方法抛出异常 使用关键字throws throws紧跟在方法签名之后 可以同时声明方法抛出多个异常 多个异常之间使用逗号隔开 throws关键字用来声明方法抛出异常 在方法体中 如果需要显式抛出一个异常 使用关键字throw throwaThrowableObject aThrowableObject必须是一个 可抛出 的对象 也就是必须是由Throwable或是其子类所生成的对象 Java程序设计与应用开发 第2版 5 3异常的抛出策略 当程序抛出一个异常的时候 必须确保所有的异常 接收者 都收到有意义的信息 也就是说 必须选择合适的异常类型 以便方法的调用者程序可以根据异常的类型来做出正确的处理 必须设置有意义的异常信息 以便看到异常或日志记录的用户能明白发生了什么事 必须让stacktrace反映出异常发生的最原始的位置信息 一个方法所声明抛出的异常 是设计该方法时必须考虑的重要因素 程序员应该站在方法调用者的立场去考虑这个问题 而不是站在书写这个方法的开发者的立场 哪些异常是对调用者有意义的 调用者可以方便地捕获并处理这些异常 哪些异常是调用者应当忽略的 调用者可以把这些异常传递给他们的调用者或用户 Java程序设计与应用开发 第2版 5 3 1不要声明抛出所有异常 声明所有可能产生的异常 是极不明智的做法 因为会破坏方法的封装性 将方法的内部实现暴露接口中 从而限制了将来可能发生的改变 有的编程人员或许会使用另一种极端的情形 方法声明抛出Exception或Throwable 这无异于上例中声明抛出所有异常的情形 甚至更糟 声明Exception或Throwable对于方法的调用者来说毫无指导意义 因此 调用这个方法的程序只能有两种选择的情形 被迫捕获Exception或Throwable 声明抛出Exception或Throwable 那么该代码的调用者又会顺次受到牵连 形成恶性循环 Java程序设计与应用开发 第2版 5 3 2异常声明的数量 在Java语言规范中 对于一个方法声明异常的数量没有一个硬性的指标 但通常声明较少的异常为好 一般来说 声明3个以上的异常通常代表着程序设计的问题 该方法做了太多的事情 应该被拆分成多个小方法 声明了太多的 低级异常 应该将这些 低级异常 映射到一个 高级的异常 类型中 也可以在方法的内部自行消化这些异常 当程序员在一个方法中抛出一个异常 即书写一个throws子句时 对于每一个想抛出的异常 首先要考虑 方法的调用者接收到这个异常后 能够做些什么 方法的调用者是否能够区分异常的不同类型 从而做出不同的处理 Java程序设计与应用开发 第2版 5 3 3保持throws子句的稳定性 将多个 低级异常 映射到少量 高级异常 的处理方法 还有一个显著的好处 它可以避免throws子句随着方法实现的改变而改变 throws子句是方法定义中的重要部分 所以保持throws子句的稳定性是非常重要的 在设计方法的初期 就声明方法抛出调用者所预期的异常 而不是在方法的实现阶段根据当前的实现方法来决定抛出何种异常 另外 在设计方法的定义时 将相关的异常组织成对象树 只在方法中声明父类异常 这是保持throws子句稳定性的好方法 Java程序设计与应用开发 第2版 5 3 4异常抛出策略小结 关于异常抛出处理的策略结合本节内容总结为以下6条经验策略 从方法使用者的角度 而不是书写该方法的开发者的角度来考虑 声明对使用者有意义的异常 何时抛出异常 在所设计的方法遇到不能处理的非正常情形下 应当声明抛出异常 不声明所有可能发生的异常 要尽可能地将 低级异常 映射成对方法使用者有意义的 高级异常 不要声明抛出 Exception 或 Throwable 因为声明抛出 超级异常 对方法使用者来说是毫无用处的 而且会导致极差的代码风格 一般不声明抛出超过3个的异常 如果发生这种情况 也要通过代码重构或将多个异常映射到一个通用的异常中来解决该问题 或者在方法内部自行消化部分内部异常 将异常组织成一个对象树结构 有利于保持方法定义的稳定性 同时也给方法的使用者提供了以不同粒度处理异常的自由 Java程序设计与应用开发 第2版 5 4异常的捕获策略 5 4 1混淆的异常代码示例 该代码只是简单地捕获所有异常 并把它记录在日志中而已 但是 有一点需要注意的是 RuntimeException是Exception的子类 捕获Exception同样会捕获所有的RuntimeException及其子类 假如你想分别处理java io FileNotFoundException和java io EOFException这两种异常 由于这两种异常都是java io IOException的子类 因而仅仅捕获IOException 就会出现混淆 Java程序设计与应用开发 第2版 5 4 2代码重构的困难 捕获 超级异常 所带来的另外一个麻烦就是导致重构代码变得异常困难 为了让项目能尽快完成 你将整个方法用一个巨大的try catch块包裹起来 在方法的末尾捕获所有的异常 如此 就给自己和以后查看该代码的人设置了一个陷阱 trap 过了一段时间 当你对上面的代码进行重构时 你或许想把过长的方法分拆成两个较小的方法 随着对方法的拆分 try catch块也被分成了两份 第一份 方法methodPart1 包含对SomeToolkit someMethod 的调用 因而可能抛出SomeException 第二份 方法methodPart2 则没有任何异常 但是编译器并不会告诉你方法methodPart2 中的try catch块是多余的 程序员都很容易忽略此类问题 因为你无法依赖编译时刻的检查来自动发现这样的问题 这个问题将使代码变得臃肿 令人难以理解 Java程序设计与应用开发 第2版 5 4 3捕获超级异常的合理情形 有的时候 捕获Exception或Throwable也是十分合理的 例如 应用程序中的最后一级错误处理程序 应用程序服务器中 不希望因为一个应用的异常而导致整个应用服务器的运行终止 在调用外部可能带有恶意代码的情形下 如果要保持系统不崩溃和数据结构的超级安全 那么就必须捕获java lang Throwable而不管被抛出异常的实际类型 但是 在绝大多数的情况下 捕获Exception或Throwable都是不需要的 Java程序设计与应用开发 第2版 5 4 4异常捕获策略小结 可以将异常捕获的策略归结为以下几条 尽可能只捕获指定的异常 而不是捕获多个异常的公共父类 除非确信这个异常的所有子类对程序来说是没有差别的 可以用同样的方式来处理它们 同样也要考虑该异常将来可能的扩展 只要有可能 就不要捕获java lang Exception或java lang Throwable 如果有多个指定的异常需要处理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 转运遗体服务方案范本
- 宿迁火锅店装修施工方案
- 2025火电电力职业鉴定题库试题【易错题】附答案详解
- 2026届四川省遂宁市射洪县九上化学期中综合测试试题含解析
- 卡夫卡文学体系解析
- 校招入职培训述职报告
- 消防工程招标施工方案
- 报废路灯回购方案范本
- 宾馆应急演练方案范本
- 80吨吊车施工方案书
- 无人机维修安全知识培训课件
- 机械设备维护保养详细操作手册
- 村卫生室消防知识培训课件
- 智能控制技术发展前景分析
- T-CCASC 0043-2024 氯碱工业数字化车间建设指南 电解
- 2024年西安医学院第一附属医院招聘真题
- 国企纪委面试题目及答案
- 卡西欧 fx-991CN X 科学计算器使用说明书
- 排污许可条例培训课件
- 婴儿配方奶粉管理办法
- 政务摄影培训课件模板
评论
0/150
提交评论