第59条:避免不必要地使用受检的异常
受检的异常是Java设计语言的一项很好的特性。与返回代码不同,他们强迫程序员处理异常的条件,大大增强了可靠性。也就是说,过分使用受检的异常会使API使用起来非常不方便。如果方法抛出一个或者多个受检的异常,或者他必须声明他抛出这些异常,并让他们传播出去。无论哪种方法,都给程序员增添了不可忽视的负担。
如果正确的使用API并不能组织这种异常条件的产生,并且一点产生异常,使用API的程序员可以立即采取有用的工作,这这哦那个负担就被认为是正当的。除非这两个条件都成立,否则更适合于使用未受检的异常。
被一个方法单独抛出的受检异常,会给程序员带来非常高的额外负担。如果这个方法还有其他的受检异常,它被调用的时候一定已经出现在一个try块中,所以这个异常只需要另外一个catch块。如果方法只抛出单个受检的异常,仅仅一个异常就会导致该方法不得不外于try块中,在这些情况下,应该问自己,是否有别的途径来避免使用受检的异常。
把受检的异常编程未受检的异常”的一种方法是,把这个抛出异常的方法分成两个方法,其中第一个方法返回一个boolean,表明是否应该抛出异常。
重构前:
try{
obj.action(args);
}catch(TheCheckedException){
...
}
重构后:
if(obj.actionPermitted(args)){
obj.action(args);
}else{
...
}
这种重构不总是恰当的,但是凡是在恰当的地方,调用API会觉得用起来很舒适,虽然代码优雅度可读性较差,但是它更加灵活。
注: 在对象缺少外部同步的情况下并发访问,或者可被外界改变状态,这种重构就是不恰当的。