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年出版,到现在已经将 ...
随机推荐
- HDU 4463 Outlets 【最小生成树】
<题目链接> 题目大意: 给你一些点的坐标,要求你将这些点全部连起来,但是必须要包含某一条特殊的边,问你连起这些点的总最短距离是多少. 解题分析: 因为一定要包含那条边,我们就记录下那条边 ...
- Python 合并两个列表的多种方式,合并两个字典的多种方式
一.合并列表 1.最简单的,使用+连接符: >>> a = [1,2,3] >>> b = [7,8,9] >>> a + b [1, 2, 3, ...
- ddctf2019--web部分writeup
0x00前言 上周五开始的DDCTF 2019,整个比赛有一周,题目整体来说感觉很不错,可惜我太菜了,做了4+1道题,还是要努力吧 0x01 web 滴~ 打开看着url,就像文件包含 文件名1次he ...
- Looping through the content of a file in Bash
https://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash One way to ...
- Codeforces.666E.Forensic Examination(广义后缀自动机 线段树合并)
题目链接 \(Description\) 给定串\(S\)和\(m\)个串\(T_i\).\(Q\)次询问,每次询问\(l,r,p_l,p_r\),求\(S[p_l\sim p_r]\)在\(T_l\ ...
- 英语口语练习系列-C13-聚会
词汇 音频 1. apartment [əˈpɑ:tmənt] n. 公寓 a big / small apartment 一个大的/小的公寓 in an apartment 在公寓 2. arm [ ...
- 2602 ACM 杭电 骨头容器 01背包
题意:装骨头的容器大小固定,有一堆骨头,已知骨头的价值和大小,在不超过容积大小的情况下,问:所装骨头的最大价值? 思路:典型的01背包问题,不需要有任何的变动. 模板: for(int j=v;j&g ...
- node+express跨域处理
- Cow Acrobats [POJ3045] [贪心]
Description 农夫的N只牛(1<=n<=50,000)决定练习特技表演. 特技表演如下:站在对方的头顶上,形成一个垂直的高度. 每头牛都有重量(1 <= W_i <= ...
- 最优贸易 [NOIP 2009]
Description C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向 ...