1 参数校验的意义
大多数方法对传递给它们的参数值有限制。例如,索引值必须非负,对象引用必须非空。
应该清楚地在文档中记录所有这些限制,并在方法主体的开头使用检查来实施它们。
应该在错误发生后尽快找到它们,这是一般原则。如果不这样做,就不太可能检测到错误,而且即使检测到错误,确定错误的来源也很难。
若一个无效参数被传递给一个方法
若该方法在执行前检查参数,这过程将迅速失败,并引发异常
若方法未检查参数,可能会在处理过程中出现:
莫名其妙的异常而失败
正常返回,但会悄悄计算错误结果
正常返回,但会使某对象处于隐患状态,可能在未来某不确定时间在某不相关代码点报错。
总之,若无验证参数,可能会违反失败原子性。
对public、protected方法,要在方法说明使用 Javadoc 的 @throws 标签说明如果违反参数值限制时会抛出的异常。通常为 IllegalArgumentException、IndexOutOfBoundsException 或 NullPointerException。一旦在文档中记录了方法参数上的限制,并且记录违反这些限制将引发的异常,强加这些限制就很简单了。
看案例:
文档注释并没说「若 m 为空,mod 将抛NPE」,尽管方法确实这么做了,作为调用 m.signum() 的副产物。该异常记录在外围 BigInterger 类级别的文档注释。类级别注释适用于类的所有public方法中的所有参数。这可以避免在每个方法上分别记录每个 NullPointerException 而造成混乱。
它可与 @Nullable 或类似注解结合使用,以指示某特定参数可能为 null,但这种做法并不标准,而且使用了多个注解。
2 最佳实践
Java 7 提供 Objects.requireNonNull 不再需手动执行空检查。
如果愿意,还可自定义异常详情。该方法返回其输入,所以使用一个值的同时可执行判空:
// 内置 Java 的判空功能 this.strategy = Objects.requireNonNull(strategy, "strategy");
也可以忽略返回值并使用 Objects.requireNonNull 作为一个独立判空方法。

