何处理方法,因此非运行期异常必须有throws子句标出,不标出或者调用者不捕获该类型异常都会导致编译失败,从而防止程序员本身疏忽。
运行期异常是程序在运行过程中本身考虑不周导致的异常,例如传入错误的参数等。抛出运行期异常的目的是防止异常扩散,导致定位困难。因此在做异常体系设计时要根据错误的性质合理选择自定义异常的继承关系。
还有一种异常是Error 继承而来的,这种异常由虚拟机自己维护,表示发生了致命错误,程序无法继续运行例如内存不足。我们自己的程序不应该捕获这种异常,并且也不应该创建该种类型的异常。
规则5 在程序中使用异常处理还是使用错误返回码处理,根据是否有利于程序结构来确定,并
且异常和错误码不应该混合使用,推荐使用异常。(1.42+)
说明:
一个系统或者模块应该统一规划异常类型和返回码的含义。 但是不能用异常来做一般流程处理的方式,不要过多地使用异常,异常的处理效率比条件分支低,而且异常的跳转流程难以预测。
注意:Java 5.0 程序内部的错误码可以使用枚举来表示。
规则6 注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。(1.42+) 说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。 示例:
下列语句中的表达式
word = (high << 8) | low (1) if ((a | b) && (a & c)) (2) if ((a | b) < (c & d)) (3) 如果书写为
high << 8 | low a | b && a & c a | b < c & d
(1)(2)虽然不会出错,但语句不易理解;(3)造成了判断条件出错。
规则7 避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的
常量,不应直接使用数字,必须用有意义的静态变量或者枚举来代替。使用异常来表示方法执行错误,而不是使用C++的错误返回码方式。(1.42+)
示例:如下的程序可读性差。 if (state == 0) {
state = 1;
... // program code }
应改为如下形式:
private final static int TRUNK_IDLE = 0; private final static int TRUNK_BUSY = 1;
private final static int TRUNK_UNKNOWN = -1;
if (state == TRUNK_IDLE)
Page 12 , Total 19