Effective Java 第三版——74. 文档化每个方法抛出的所有异常
Tips
书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code
注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本。
74. 文档化每个方法抛出的所有异常
描述方法抛出的异常,是正确使用方法所需文档的重要部分。因此,花时间为每个方法抛出的所有异常建立文档是非常重要的(条目 56)。
始终单独声明检查异常,并使用Javadoc @throw
标签,精确地记录每次抛出异常的条件。不要使用“快捷方式”声明一个方法抛出它可以抛出的多个异常类的超类。作为一个极端的例子,不要声明公共方法抛出Exception
类,或者更糟,抛出Throwable
类。除了拒绝向方法的用户提供关于它能够抛出的异常的任何指导之外,这样的声明还极大地阻碍了方法的使用,因为它极大掩盖了可能在相同上下文中抛出的任何其他异常。这个建议的一个例外情况是main方法,它可以安全地声明为抛出Exception
类,因为它只被虚拟机调用。
虽然Java语言不要求程序员声明方法能够抛出的未检查异常(unchecked exceptions),但明智的做法是像检查异常一样仔细地在文档中记录它们。未检查异常通常表示编程错误(条目 70),让程序员熟悉他们可能犯的所有错误可以帮助他们避免犯这些错误。方法可以抛出的未检查异常的良好文档列表有效地描述了成功执行的先决条件。每个公共方法的文档都必须描述它的先决条件(条目 56),记录它的未检查异常是满足这个需求的最佳方法。
特别重要的是,接口中的方法要在文档中记录它们可能抛出的未检查异常。此文档构成接口通用约定的一部分,并支持接口的多个实现之间的公共行为。
使用Javadoc @throw
标签记录方法可以抛出的每个异常,但是不要对未检查的异常使用throws关键字。重要的是,使用你的API的程序员必须知道哪些方法是检查异常,哪些是未检查异常,因为程序员的责任在这两种情况下有所不同。Javadoc @throws
标签生成的文档在方法声明中没有对应的抛出子句,这向程序员提供了一个强烈的视觉暗示,说明该异常是未检查异常。
应该注意的是,在文档中记录每个方法可以抛出的所有未检查异常是理想的,在现实世界中并不总是可以实现。当类进行修订时,如果将导出的方法修改为抛出额外的未检查异常,这并不违反源代码或二进制兼容性。假设一个类从另外一个独立编写的类调用一个方法。第一个类的作者可能会仔细记录所有的每个方法抛出未经检查的异常,但是如果第二个类的作者修改为额外的未经检查的异常,很可能第一个类(未经修订)将传播新的未经检查异常,尽管没有文档记录它们。
如果一个类中的许多方法出于相同的原因引发异常,可以在类的文档注释中记录异常,而不是为每个方法单独记录异常。一个常见的例子是NullPointerException。类的文档注释可以这样说:“如果在任何参数中传递了null对象引用,该类中的所有方法都会抛出NullPointerException”,或者类似的描述。
总之,在文档中记录你所编写的每个方法可能引发的每个异常。对于未检查异常、检查异常以及抽象方法和具体实现方法中都是如此。这个文档应该在文档注释中采用@throws
标签的形式。在方法的throws子句中分别声明每个检查异常,但不要声明未检查异常。如果未记录方法可能抛出的异常,其他人将很难或不可能有效地使用你的类和接口。
Effective Java 第三版——74. 文档化每个方法抛出的所有异常的更多相关文章
- Effective Java 第三版——88. 防御性地编写READOBJECT方法
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——13. 谨慎地重写 clone 方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 《Effective Java 第三版》目录汇总
经过反复不断的拖延和坚持,所有条目已经翻译完成,供大家分享学习.时间有限,个别地方翻译得比较仓促,希望有疑虑的地方指出批评改正. 第一章简介 忽略 第二章 创建和销毁对象 1. 考虑使用静态工厂方法替 ...
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——56. 为所有已公开的API元素编写文档注释
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Effective Java 第三版——82. 线程安全文档化
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Effective Java 第三版——49. 检查参数有效性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- python编码问题在此终结
转载:https://www.cnblogs.com/whatisfantasy/p/6422028.html 1 版本差异概览 1.1 Python 2.X: str(用于8位文本和二进制数据) ...
- POJ 2481 Cows 【树状数组】
<题目链接> 题目大意: 就是给出N个区间,问这个区间是多少个区间的真子集. 解题分析: 本题与stars类似,只要巧妙的将线段的起点和终点分别看成 二维坐标系中的x,y坐标,就会发现,其 ...
- poj3311
poj3311我写的第一篇状压dp,调试了好久23333,其实状压就是二进制结合位运算,把整体的状态用二进制来表示,一般是0/1,用没用过或者走没走没走过的问题,其实这种思想在搜索中也有涉及过,与dp ...
- linux 学习笔记 wc命令
#wc 文件名.txt 输出 4 13 65 文件名.txt -->4 行13个单词 #wc -w 文件名.txt 统计单词数量 #wc -l 文件名.txt 统计行数 #wc -c 文 ...
- SourceTree 文件被锁异常
公司用的代码管理工具是 Git 客户端用的是 SourceTree ,前些天 SourceTree 发生文件被锁异常,导致文件无法上传,下载,今天特意做个记录 异常: 解决方法:
- 一道有意思的找规律题目 --- CodeForces - 964A
题目连接: https://vjudge.net/problem/1502082/origin 这一题第一眼看过去貌似是模拟,但是根据其范围是1e9可以知道,如果暴力解基本上是不可能的(不排除大佬级优 ...
- 2017-10-5-Python
想学习Python很长时间了,工作中使用Python脚本解决问题真的很爽. 插入一张Python的py文件常见的结构图: if __name__ =="__main__" 这条语句 ...
- Android应用程序性能优化Tips
对于我们设计的应用需要做到以下特征:build an app that's smooth, responsive(反应敏捷), and uses as little battery as possib ...
- php 操作json的各种格式
php中操作json的函数 加密:json_encode() ,也就是把数据转成json格式 * 数组转换成json格式时,索引数组得出的结果是不带映射关系,所以都是[]:关联数组是映射,所以最外围是 ...
- BZOJ2167 : 公交车站
设$f[i]$表示$i$往上通过一趟公交车能到达的深度最小的祖先,这可以通过将公交车按$lca$深度从小到大排序后用并查集染色得到. 对于每个询问: $1.x==y$ $ans=0$. $2.x$是$ ...