a>:异常只应该被用于不正常的条件,它们永远不应该被用于正常的控制流.
b>:一个设计良好的API不应该强迫它的客户为了正常的控制流而使用异常。如Iterator<T>, next()状态方法,hasNext()状态测试方法.
pubilc interface Iterator<T> {
public boolean hasNext();
public T next();
public void remove();
}
"状态测试方法"和"可被识别的返回值"这两种做法选择的指导原则.
c>:用运行时异常来指明程序错误.也就是说,检查应该由调用方来完成,而调用方未保证条件的正确性,刚导致异常的出现,此时应该
使用RuntimeException.
对于可恢复的使用Exception,它也相当于一个方法的除了正常返回值的第二个返回值.
异常要表达:出了什么错误,在那儿出错了,出错的信息收集,建议的解决办法.
public IndexOutOfBoundsException(int lowerBound,int upperBound,int index) {
//记录发生异常时的状态值.
super("Lower bound: " + lowerBound + ", Upper bound: " + upperBound + ", Index: " + index);
}
d>:异常转译,出现频率最高的:将Exception转换为RuntimeException抛出.
高层的实现应该捕获低层的异常,同时抛出一个可以按照高层抽象进行解释的异常,这种做法被称为异常转译(exception translation).
尽管异常转译比不加选择地传递低层异常的做法有所改进,但是它也不能被滥用。如果可能的话,处理来自低层的最好做法是,在
调用低层方法之前确保它们会成功执行,从而避免它们会抛出异常。有时候,你可以在给低层传递实参之前,显式地检查这些实参
的有效性,从而避免低层方法会抛出异常, 其次是让高层来处理这些异常,从而将高层方法的调用者与低层的问题隔离开.
如果既不能阻止来自低层的异常,也无法将它们与高层隔离开,那么一般的做法是使用异常转译。只有在低层方法的规范碰巧可以
保证“它所抛出的异常对于高层也是合适的”情况下,才可以将异常从低层传播到高层.
e>:业务处理中可能要定义一套自己的业务异常.
但尽量使用标准的异常.
IllegalArgumentException 参数的值不合适
IllegalStateException 对于这个方法调用而言,对象状态不合适.
NullPointerException 在null被禁止的情况下参数值为null
IndexOutOfBoundException 下标超界
ConcurrentModificationException 在禁止并发修改的情况下,对象检测到并发修改
UnsupportedOperationException 对象不支持客户请求的方法
ArithmeticException
NumberFormatException
f>:每个方法抛出的异常都要有文档.
一但方法可能抛出异常,不管是Exception还是RuntimeException,都需要在doc中进行描述,特别是RuntimeException
对于一个方法可能抛出的未被检查的异常,如果将这些异常信息很好地组织成一个列表文档,则可以有效地描述出这个方法
被成功执行的前提条件。
g>:失败的原子性.
不可变对象自动保证失败的原子性.
对于在可变对象上执行操作的方法,获得失败原子性最常见的办法是,在执行操作之前检查参数的有效性。这可以使得在对象
的状态被修改之前,适当的异常首先被抛出来.
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null;//Eliminate obsolete reference
return result;
}
如果初始的大小(size)检查被处掉的话,当这个方法企图从一个empty stack 中弹出元素时,它仍然会抛出一个异常。然而,这将会
导致size域保持在不一致的状态(负数)中,从而使得将来对该对象的任何方法调用都会失败.而且,那时候,pop方法抛出的异常对于
该stack抽象来说也是不恰当的.
另一种类似的获得失败原子性的办法是,对计算处理过程调整顺序,使得任何可能会失败的计算部分都发生在对象状态被修改之前.
在向TreeMap中添加一个元素,该元素的类型必须可能过TreeMap的排序准则与其它的元素进行比较,企图增加一个类型不正确的
元素将导致ClassCastException异常.这实质上是上一种办法的变体.都是在真正修改对象状态之前,抛出异常.
第三种办法也一段恢复代码.解释操作过程中发生的失败,以及使对象回滚到操作开始之前的状态上.
最后一种办法就是在对象一份临时拷贝上执行操作,当操作完成之后再把临时拷贝中的结果复制给原来的对象.这样做的原因
可能是出于性能的考虑,也有一个附加好处,即使失败了,对象的状态仍保持原样.
总结一条规则:作为方法规范的一部分,任何一个异常都不应该改变对象调用该方法之前的状态.如果这条规则被违反,则API
文档应该清楚地指明对象将会处于什么样的状态。
分享到:
相关推荐
品 质 异 常 统 计 表.doc
继承及其JAVA实现 多态及其JAVA实现 访问修饰符对类成员的访问限制 方法修饰符:static、final、abstract
文档标题和描述中提到的“异常处理单”是制造业中质量控制和问题解决的一个关键工具。在IT行业中,异常处理同样重要,特别是在软件开发、系统维护和数据分析等领域。以下是关于异常处理的一些详细知识点: ...
在编程领域,异常是程序运行过程中遇到的错误或异常情况,它们中断了正常的代码执行流程。在Java中,异常处理是程序健壮性的重要组成部分,它允许程序员优雅地处理可能出现的问题,而不是让程序突然崩溃。...
质量异常报告单是企业在生产或服务过程中用于记录和追踪质量问题的重要文档。它的目的是及时发现、分析和解决生产过程中的各种异常情况,确保产品质量符合标准,防止不良品的产生,提高客户满意度。...
《制造异常反应表》是制造业中用于记录和处理生产过程中出现异常情况的重要工具,它能够帮助企业及时发现并解决生产过程中的问题,确保产品质量和生产效率。以下是对该文档及其部分内容的详细解读: ...
【Java程序设计:异常处理】 异常(Exception)是Java编程语言中用来表示程序运行时出现的非正常情况或错误事件的机制。Java中的异常处理主要包括五个关键字:try、catch、finally、throw和throws。...
6. `rr_harris.m`:Harris角点检测器,常用于寻找图像中的关键点,可能在这个配准算法中作为特征检测的一部分。 7. `rr_MTransformation.m`:这可能涉及到几何变换模型,如仿射变换或透视变换,用于将一个图像转换到...
在地球物理勘探领域,重力异常正演模拟是一种常用的技术,用于预测地壳下的地质结构。这个主题聚焦于“均匀球体与长方体重力异常正演模拟”,使用编程语言Matlab来实现。Matlab因其强大的数值计算能力,被广泛应用于...
这种技术常用于商业软件,以防止未经授权的复制和使用。 金万维异速联是一款知名的远程连接与授权解决方案,它提供了跨平台的连接能力,使得用户能够在不同的设备和网络环境下安全地访问和使用应用软件。版本6.2.3...
这 个try语句块用来启动Java的异常处理机制:当发现其语句块中含有运行错误的语句时,或调用包含异 常抛出的方法,或用throw语句强行抛出异常时,系统都会抛出异常。 二、Java常见异常处理 Java的异常处理机制...
机 械 设 备 状 态 监 测 是 指 利 用 各 种 监 测 和 测 量 方 法,对 设 备 进 行 监 测,获取 设 备 的 状 态 信 息,以 确 认 设 备 是否 存 在 故 障 或 异 常 情 况。机 械 设 备 状 态 监 测 包 括 四 个 方 ...
继电器常用于隔离主电路和控制电路,而开关则可以手动或自动操作,改变电路状态。 5. 电气布线与接线图:电气图中会详细标注导线的规格、颜色编码以及连接方式,这对于正确安装和维护异纤机的电气系统至关重要。 6...
第1章 对象的演化 第2章 数据抽象 第3章 隐藏实现 第4章 初始化与清除 第5章 函数重载与缺省参数 ...第17章 异 常 处 理 第18章 运行时类型识别 附录A 其 他 性 能 附录B 编 程 准 则 附录C 模拟虚构造函数
第一章:Java 简介第二章:Java 语言基础第三章:面向对象的概念和 Java 实现-1第四章:面向对象的概念和 Java 实现-2第五章:异 常第六章:java.lang包第七章:java.util 包第八章:java.io 包 第九章:JBuilder ...
该资源提供了详细的故障分析和排除方法,涵盖了电动汽车的多个方面,包括整车没电、充电机不充电、电机运行异 常、电机异响、电机不转、控制器损坏等多种故障类型。 通过对故障的分析和排除,维修人员可以快速而...
第4章 运算符和表达式 第5章 数据的输入和输出 第6章 程序控制语句 第7章 数 组 21.1 OWC组件 第8章 类 第9章 继承与多态 第10章 接口、代理和事件 第11章 结构和枚举 第12章 命 名 空 间 第13章 异 常 处 理 第14章...
本文使用布隆斯公式计算高程异常,高程异常可以分解为三部分:地球重力场模型长波分量、斯托克斯特积分公式得到的地面重力异 常中波分量以及地形改正对大地水准面的影响值。在没有数字高程模型的情况下,把地球重力...
真实盈余管理 1、计算说明 对于真实盈余管理,我们仿照Roychow dhury(2006)和Cohenetal.(2008),用异常经营活动...司的实际值减预期值,差额即为异常值,分别算出异常经营活动现金流、异常产品成本和异 常费用。
温 故 知 新、 牛 九 小 试 等 内 容, 以 帮 助 读 者 学 会 处 理 程 序 异 常、 解 答 学 习 困 惑、 巩 固 知 识、 学 以 致 用。 刘宇宙. Python 3.5从零开始学 (Kindle 位置 26-30). 清华大学出版社.