阅读《Effective Java》每条tips的理解和总结(6)

76 保持失败原子性

    类似于数据库事务,一个失败的操作不应该产生任何影响。Java程序也是如此,一个执行过程成功,变量和对象则应该从一个正确的状态到另一个正确的状态;一个过程执行失败,则其中间产生的影响不应该生效,所以在抛出异常要注意保持失败原子性。一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法被称为具有失败原子性。

保持失败原子性一般有:(1)传入方法的对象是Immutable时,则方法不可能会影响此对象。(2)调整处理对象的顺序,将异常检查放在计算之前。例如栈的pop操作首先检查size是否为0,再返回element[--size],如果不先检查size为0直接抛出虽然也能正确抛出数组越界异常,但是影响了size,把size错误的置为-1。(3)对传入的对象进行拷贝,然后只操作拷贝后的对象。这个方法的适用范围比前两种广很多。

    总而言之,作为方法规范的一部分,它产生的任何异常都应该让对象保持在调用该方法之前的状态。如果违反这条规则,API文档就应该清楚地指明对象将会处于什么样的状态。

 

77 不要忽略异常 

    很简单,就是不要用空的catch块来处理异常。面对异常,要么捕获并处理它,让程序继续执行;要么传播出去,让程序执行到此结束(都要打印出具体信息,以便调试)。不要捕获但不处理,忽略异常可以暂时让程序悄悄继续执行,但是由于不正确的状态很可能会在后面执行失败,可能会造成更严重的后果。

上一篇:堆叠注入tips


下一篇:命令行小tips