文档章节

Guava——使用Preconditions做参数校验

-_-struggle
 -_-struggle
发布于 2017/05/18 18:19
字数 837
阅读 127
收藏 1

Preconditions介绍

Guava中提供了一个作参数检查的工具类–Preconditions, 静态导入这个类, 可以大大地简化代码中对于参数的预判断和处理.

import static com.google.common.base.Preconditions;
在以前, 我们需要判断一个参数不为空的话, 需要像下面这样写

public void testMethod(Object obj) {
if (obj == null) {
throw new NullPointerException();
}
// … other operations
}

 

每次都要添加if语句来做判断, 重复的工作会做好多次. 使用Preconditions可以简化成下面这样

public void testMethod(Object obj) {
Object other = checkNotNull(obj);
// … other operations
}

 

checkNotNull会检查参数是否为null, 当为null的时候会抛出NullPointerException, 否则直接返回参数.

guava

 

Preconditions用法

checkNotNull, checkArgument和checkState, 都有三种形式的参数:

public static <T> T checkNotNull(T reference), 只包含需要判断的对象, 无其他多余的参数, 抛出的异常不带有任何异常信息


public static <T> T checkNotNull(T reference, @Nullable Object errorMessage), 包含一个错误信息的额外参数, 抛出的异常带有errorMessage.toString()的异常信息


public static <T> T checkNotNull(T reference, @Nullable String errorMessageTemplate, @Nullable Object… errorMessageArgs), printf风格的错误信息, 后面是变参, errorMessageTemplate可以使用一些占位符. 例如可以这样写

checkArgument(i >= 0, “Argument was %s but expected nonnegative”, i);
checkArgument(i < j, “Expected i < j, but %s > %s”, i, j);
捕获异常后可以获取自定义的详细错误信息, 对于调试来说很有帮助, 而且代码也很简洁. 例如,

 

Object obj = null;
try {
checkNotNull(obj, "cannot be null");
} catch(Exception e) {
System.out.println(e.getMessage());
}


 

运行后可以获得自定义的异常信息”cannot be null”.

 

Preconditions里面的方法

方法签名 (不包含额外参数) 功能描述 失败时抛出的异常类型
checkArgument(boolean) 检查boolean是否为真. 用作方法中检查参数. IllegalArgumentException
checkNotNull(T) 检查value不为null. 直接返回value. NullPointerException
checkState(boolean) 检查对象的一些状态, 不依赖方法参数. 例如, Iterator可以用来next是否在remove之前被调用. IllegalStateException
checkElementIndex(int index, int size) 检查index是否为在一个长度为size的list, string或array合法的范围. index的范围区间是[0, size)(包含0不包含size). 无需直接传入list, string或array, 只需传入大小.
返回index.
IndexOutOfBoundsException
checkPositionIndex(int index, int size) 检查位置index是否为在一个长度为size的list, string或array合法的范围. index的范围区间是[0, size)(包含0不包含size). 无需直接传入list, string或array, 只需传入大小.
返回index.
IndexOutOfBoundsException
checkPositionIndexes(int start, int end, int size) 检查[start, end)是一个长度为size的list, string或array合法的范围子集.伴随着错误信息. IndexOutOfBoundsException

 

Preconditions的优点

在静态导入后, 方法很明确无歧义, checkNotNull可以清楚地告诉你它是干什么的, 它会抛出怎样的异常.
checkNotNull在验证通过后直接返回, 可以这样方便地写代码: this.field = checkNotNull(field).
简单而又强大的可变参数’printf’风格的自定义错误信息.
我们建议将preconditions放置在单独的行上, 这样可以在调试的时候清楚地指明哪个precondition出现错误. 另外, 提供有帮助的错误信息也非常有用.

 

参考资料

官方wiki: http://code.google.com/p/guava-libraries/wiki/GuavaExplained
Preconditions: http://code.google.com/p/guava-libraries/wiki/PreconditionsExplained

本文转载自:http://www.javaranger.com/archives/1534

-_-struggle
粉丝 3
博文 210
码字总数 50914
作品 0
苏州
后端工程师
私信 提问
Guava库学习:学习使用Preconditions工具类进行代码的校验

链接地址:http://www.xx566.com/detail/127.html Preconditions是guava提供的用于进行代码校验的工具类,其中提供了许多重要的静态校验方法,用来简化我们工作或开发中对代码的校验或预 处理...

Realfighter
2014/11/28
0
0
Guava 教程4-条件,多重映射和分片

在本系列博客的前三章,我们大概介绍了Google的Guava类库和Collections类库,作为一名Java开发人员,相信你会从使用这些类库,进而来减少在你项目中使用样板文件的数量而获益。在本系列博客的...

JoeyBlue
2013/02/19
3.9K
6
Guava一些高效类的使用实践

guava是google的一个强大的工具包,目前已经更新到版本22 https://github.com/google/guava,一直有断断续续的用过一些方法,但是没有系统的撸一遍所有功能 今天参考并发编程网记录一些高效的...

zimingforever
2017/06/15
0
0
Guava 2:Basic utilities基本工具

一、引子 Guava的经典很大一部分原因来源于对于基础工具类的封装,使用这些类能够让我们的代码更加优雅且完善,这些类大部分都在com.google.common.base包下。 注:JDK有很多借鉴guava的地方...

只会一点java
2018/07/25
0
0
使用 Google Guava 美化你的 Java 代码:1~4

1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMPORTS 编写漂亮代码 写在前面: 以前在一个项目中用到过guava,当时匆匆用,也没细研究,今天偶然在occhina看到这个系列教程的翻译,感觉不错,介...

大数据之路
2013/10/28
0
7

没有更多内容

加载失败,请刷新页面

加载更多

axios 使用步骤很简单,首先在前端项目中,引入 axios:

  前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个项目本身也停止维护,目前建...

SEOwhywhy
32分钟前
3
0
c++ 创建对象的三种方法

c++有三种方法创建对象 结合代码来看 1 #include <iostream> 2 using namespace std; 3 class Test { 4 5 private: 6 public: 7 add() 8 { 9 ......

天王盖地虎626
46分钟前
1
0
ant 中的fileset include等拷贝

拷贝一个目录到指定目录下 例:<copy todir="${basedir}/new"> <fileset dir="${basedir}/old"> <include name="appgen" /> <include name="appgen/" /> <include name=appgen/**" /> <incl......

shzwork
51分钟前
2
0
react-jianshu项目的创建

创建项目 1、github上创建仓库react-jianshu 2、将项目克隆到本地git clone git@github.com:startjcu/react-jianshu.git 3、在当前目录(项目目录的上级目录)下执行create-react-app react-...

星闪海洋
今天
2
0
OSChina 周二乱弹 —— 小哥哥,你可以教我写代码吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @nnnm: 生活大爆炸,结束了,这部陪伴了漫长时间的情景喜剧,最终是以诺贝尔奖和大团圆收尾的。虽然,不算精彩,但也是温馨。而少年谢尔顿的...

小小编辑
今天
858
13

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部