Java 的参数检查与断言 - Guava Preconditions

在前一篇 Scala 的参数检查与断言: require, assert, assume 和 ensuring,捉摸 Scala 的断言时提到了 JDK 内置对断言的粗略支持,也就是 assert 语句,并且默认该特性是被关掉,需 -ea 开启。

assert object != null;
assert object != null : "object can't be null";

还进一步接触了 Scala 的 Predef 方法 require, assert, assume, 和 ensuring 是怎么检验参数与断言运算结果的,Scala 的这些方法在校验失败时相应的抛出 IllegalArgumentException 和  AssertionError 异常。

JDK  7 引入了 Objects 工具类,它的三个 T requireNotNull(T object) 方法能对参数进行 null 值检查,null 时抛出 NullPointerException

可是我认为这个  requireNotNull() 对我们帮助其实不大,NullPointerException 的抛出只不过是早晚的事。我们更迫切需要一个像 Scala  那样的 require, assert 等方法,很幸运 Google 的 Guava 库为我们发明了这个轮子,那就是 Guava 的 Preconditions, 而且它比之 Scala 的处理方式来说有更完善的语义。它在断言运算结果时摒弃了含糊的 AssertionError 错误,代之以 java.lang.IllegalStateException 异常,说明运算的结果并预期(非法的状态)。

由上图可知,Preconditions(点击查看它的源码) 的方法包括四大类:

  1. checkArgument(boolean expression, ...): 校验参数,失败则抛出 java.lang.IllegalArgumentException
  2. checkState(boolean expression, ...):  检验中间结果,失败则抛出 java.lang.IllegalStateException, 语义上比 AssertionError 要准确
  3. checkNotNull(T reference, ...): 和 Objects.requireNotNull(T Objejct) 功能一样,失败也是抛出 java.lang.NullPointerExeption, 成功则得到被校验的值。可用这个方法替代  Objects 中的相应方法。
  4. checkXxxIndex(): 这类方法用得较少,检验是否为集合的有效索引,失败则抛出 IndexOfOfBoundsException

来个类似于上篇的的简单例子吧:

 

本文链接 https://yanbin.blog/java-assertion-guava-preconditions/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

1 Comment
Inline Feedbacks
View all comments
trackback

[…] Java 的参数检查与断言 介绍了在 Java 中如何应用 Guava 的 Preconditions […]