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年出版,到现在已经将 ...
随机推荐
- 2018 icpc 青岛网络赛 J.Press the Button
Press the Button Time Limit: 1 Second Memory Limit: 131072 KB BaoBao and DreamGrid are playing ...
- 躲不掉的 lambda 表达式
lambda 表达式是 Java8 的新特性,虽说都发布很久了,但是不到万不得已是肯定不会研究这个的,现在就是那不得不学习的时候了. 本文主要说一下什么 lambda 表达式.Java 中为什么要有 ...
- 使用 universalimageloader 缓存图片的配置类及使用方法
0.gradle 配置 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:juni ...
- 2018-6-20-随笔-SQL Server中乱码
SQL Server中乱码解决方案: 在Sql Server2005英文版中,如果未对Varchar类型的字段进行设置,那么很多朋友会发现向数据库中插入记录时,如果对应的varchar类型字段 的值为 ...
- Java笔记(四)常用基础类
常用基础类 一)String String内部用一个字符数组表示字符串: private final char value[]; 注意:Java9对此做了优化,采用byte[],如果字符都是ASCII ...
- 2110 ACM Crisis of HDU 母函数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2110 题意:分出1/3的价值,有几种可能? 思路:母函数 与之前的题目2079相似,复习笔记再来写代码: ...
- 修改mybatis plus Generator模板生成字段注释枚举常量
修改mybatis plus Generator模板生成字段注释枚举常量 本文基于最新的mybatis-plus 3.0.1版本源码修改,如果使用其它版本,处理方式也类似,主要是生成Entity的Fr ...
- 函数的name属性
匿名函数表达式的广泛使用加大了辨别函数的难度,所以ES6 中为所有函数新增了name属性 例如: name属性的特殊情况 (1) (2) 绑定函数的name属性总是由被绑定函数的name属性和字符串前 ...
- python 3.5 连接mysql数据库
python 3.5 要连接mysql数据库,必须先安装pymysql模块,该模块可以操作mysql数据. 1.安装pymysql模块:使用pip进行安装 cmd打开运行模式,切换目录到pip的scr ...
- 11-30 js高级
1.事件: 浏览器客户端上客户触发的行为都称为事件 所有的事件都是天生自带的,不需要我们去绑定,只需要我们去触发. 通过obj.事件名=function(){} 事件名:onmouseover onm ...