一、为什么Javadoc里的异常说明不能随便写

很多写Java的开发者都用过Javadoc,但很少有人认真研究过异常说明的写法,大部分人只会随便加一句@throws Exception就完事。我之前做项目就踩过这个坑:当时用了一个第三方工具类,注释里只写了@throws IOException,我就理所当然以为只有网络问题才会抛这个异常,结果实际调用时传入了一个不存在的文件路径,直接抛出了IOException,害得我写的非空校验完全没覆盖到这个场景,排查问题花了整整一个下午。其实这就是因为异常说明没写清楚,导致后续调用方法的人完全不知道什么时候会出问题,也不知道该怎么处理。

1.1 最常见的错误写法

大部分人写Javadoc异常说明时,只会笼统提一句异常类型,完全不说触发条件和处理方式。比如下面的例子,这种写法等于没写,没人知道该怎么用:

/**
 * 处理输入的文本
 * @param text 需要处理的文本
 * @throws Exception 处理失败时抛出的异常
 */
public String processText(String text) throws Exception {
    // 省略处理逻辑
    return text.toUpperCase();
}

1.2 模糊写法的影响

模糊的异常说明会带来三个核心问题:一是增加调试成本,出了问题要自己翻源码找触发场景;二是增加沟通成本,新人调用时只能问写代码的人,破坏团队协作效率;三是增加线上风险,调用方不知道该怎么处理,要么直接吞掉异常要么重复报错。

二、异常说明的规范写法拆解

Javadoc里的异常说明,核心要讲清楚两个点:什么时候会触发这个异常,以及调用方该怎么处理这个异常,缺一不可。不能只写异常类型,必须结合具体的场景说明,让拿到注释的人一眼就懂。

2.1 规范写法的核心要素

每个@throws注释必须包含三个部分:异常类型、触发场景、处理建议,不能少任何一个。比如之前的工具类例子,如果按规范写,就会清晰很多。

2.2 反例与正例的对比演示

我们用同一个场景做对比,反例是常见的错误写法,正例是符合规范的写法,直接看代码就能明白差距:

// 技术栈:Java
/**
 * 将输入的姓名转为标准格式(去除前后空格+首字母大写)
 * @param name 用户输入的姓名,允许为空但不能为null
 * @return 标准化后的姓名
 * @throws IllegalArgumentException 当name参数为null时抛出,调用方需在传入参数前做非空校验,比如先判断name != null
 * @throws RuntimeException 当输入姓名长度为0时抛出,调用方可提示用户“姓名不能为空”
 */
public String formatName(String name) {
    if (name == null) {
        throw new IllegalArgumentException("姓名不能为null");
    }
    String trimmed = name.trim();
    if (trimmed.isEmpty()) {
        throw new RuntimeException("姓名长度不能为0");
    }
    return trimmed.substring(0,1).toUpperCase() + trimmed.substring(1).toLowerCase();
}

这个正例里,两个异常都写了明确的触发场景和处理建议,调用方拿到注释后,直接就能知道该怎么处理参数,不用再翻源码。

三、规范写法的应用场景详解

不是所有方法都需要这么详细的异常说明,核心是在对外暴露的方法里,必须严格遵守规范。下面分三个最常见的场景说明:

3.1 工具类的核心方法

工具类比如字符串处理、文件处理、日期处理,都是团队里高频调用的,异常说明一定要写清楚触发场景。比如StringUtils的join方法,就要说明当集合为null时抛出什么异常,调用方该怎么处理。

3.2 业务接口的对外方法

业务接口比如用户注册、订单创建,这些方法是前端或其他模块调用的,异常说明必须覆盖所有可能的业务异常,比如用户名重复抛出什么异常、手机号格式错误抛出什么异常,调用方要根据异常类型给用户不同的提示。

3.3 第三方依赖的封装方法

如果封装了第三方工具的方法,比如封装OkHttp的get请求,异常说明要说明第三方可能抛出的异常,比如网络超时、响应码非200,调用方可选择重试或记录日志。

四、规范写法的优缺点和注意事项

4.1 优势

规范的异常说明有三个明显好处:一是降低调试成本,出问题直接看注释就知道原因;二是提升代码可维护性,后续接手的人不用问就懂;三是减少线上问题,调用方能正确处理异常。

4.2 注意事项

写的时候要注意三个细节:一是不能漏,所有可能抛出的受检异常和运行时异常都要说明;二是不能错,不要把方法里没抛出的异常写进去,比如方法里只抛IllegalArgumentException,就不要写IOException;三是不能重复,同一个异常不要在多个@throws里写不同的触发场景,要统一说明。

五、总结

Javadoc里的异常说明不是形式主义,是开发者之间的“隐形沟通语言”。好的异常说明能让代码的可维护性提升不止一个档次,尤其是在团队协作项目里,规范的写法能减少很多不必要的沟通和调试时间。不管是新入行的开发者还是有经验的老程序员,都应该重视异常说明的规范写法,这是职业素养的一部分,也是写出高质量代码的基础。