Effective Java 笔记(十一)

xiaoxiao2026-08-15  21

相关读书笔记列表

NO.42 尽量使用标准的异常 Java平台库中讫今为止最常被重用的异常如下: IllegalArgumentException 参数值不合适 IllegalStateException 对于这个方法调用而言,对象的状态不合适(如初始化不恰当) NullPointerException 在null被禁止的情况下参数值为null IndexOutOfBoundsException 下标越界 ConcurrentModificationException 在禁止并发修改的情况下,对象检测到并发修改 UnsupportedOperationException 对象不支持客户请求的方法 其它的异常也可以使用,只要确保抛出异常的条件与文档要求一致即可。 NO.43 抛出的异常要适合于相应的抽象   高层的实现,应该捕获低层的异常,同时抛出一个可以按照高层抽象进行解释的异常,这种做法叫做异常转译(exception translation)。即如: //exception translation! try{ //use lowlevel abstraction to do our bidding ... }catch(LowerLevelException e){ throw new HigherLevelException(...); }   低层的异常被高层的异常保存起来,且高层的异常提供一个公有的访问方法来获得低层的异常,这种做叫做异常链接(exception chaining)。 //Exception chaining. try{ //use lower-level abstraction to do our bindding ... }catch(LowerLevelException e){ throw new HigherLevelException(e); }   异常链的实现非常简单,在1.4及以后版本中,可以通过Throwable来获得支持。 //Exception chaining in release 1.4 or later HigherLevelException(Throwable t){ super(t); } 处理来自低层的异常, 最好的做法是,在调用低层方法之前通过一些检查等手段来确保它们会成功执行; 其次的做法是,让高层处理这些异常,从而将高层方法的调用者与低层的问题隔离开; 一般的做法是使用异常转译; 如果低层方法的异常对高层也是合适的,则将其从低层传到高层。 NO.44 每个方法抛出的异常都要有文档 总是要单独地声明被检查的异常,并且利用jacadoc的@throws标记,准确地记录下每个异常被抛出的条件。 使用javadoc的@throws标签积累下一个方法可能会抛出的每个未被检查的异常,但是不要使用throws关键字将未被检查的异常包含在方法的声明中。 如果一个类中的许多方法出于同样的原因而抛出同一个异常,那么在该类的文档注释中对这个异常做文档,而不是为每个方法单独写一个文档。 NO.45 在细节消息中包含失败 - 捕获信息 为了捕获失败,异常信息应该尽可能多的包含有意义的参数和域的值,如:IndexOutOfBoundsException应该包括上界、下界以及实际的下标。 NO.46 努力使失败保持原子性 一个失败的方法调用应该使对象保持“它在被调用之前的状态”,方法如下: ① 使用非可变对象; ② 在可变对象上的操作,应在执行前检查参数的有效性; ③ 写一段恢复代码,在执行失败的情况下,回滚到操作开始之前的状态(不常用); ④ 在对象的一份临时拷贝上执行操作,当完成之后,再把临时拷贝中的结果复制给原来的对象,如Collections.sort在执行排序之前,先把它的输入转储到一个数组中,这样既能降低内循环的开销,又能保证在排序失败的时候,输入列表将保持原样。 NO.47 不要忽略异常 除非有特殊的需求(如动画中的多帧图像播放),否则不要吃掉异常,至少在catch块中包含一条说明,用来解释为什么忽略这个异常。简单地将一个未被检查的异常传播到外界至少会使程序迅速地失败,从而保留了有助于调试该失败条件信息,比异常被忽略后的一个不可预测的时刻程序失败这种情况要强。

转载请注明原文地址: https://www.6miu.com/read-5051276.html

最新回复(0)