Assert工具(断言)的使用、ReturnAssert工具

发布时间:2026/7/28 21:41:03
Assert工具(断言)的使用、ReturnAssert工具 文章目录assert机制为什么要用assert完整版代码(包括异常处理)判断是否是空字符串生产环境为什么不推荐用断言assert和AssertUtils的区别Assert工具为什么不受断言开关的影响呢?spring Assert的使用判断字符串是否为空spring只有Assert这一个实现类吗?自定义断言工具自定义断言工具代码ReturnAssert工具assert机制其实就是相当于判断工具如果不符合期待就抛出异常异常信息为自定义的message。代码原生assert(java关键字assert)例子assert!StringUtils.isEmpty(request.getName());assert工具类列子(如spring的Assert类)Assert.hasText(null,参数错误);Assert.notNull(null,asdf);Assert.isTrue(false,判断错误);为什么要用assert最直接的原因就是为了简化代码。可以看下下面代码的区别。不用断言Stringusername;Stringpassword;if(StringUtils.isNotEmpty(username)){return用户名不能为空;}if(StringUtils.isNotEmpty(username)){return用户名不能为空;}使用断言try{Stringusername;Stringpassword;Assert.hasLength(username,用户名不能为空);Assert.hasLength(username,密码不能为空);}catch(IllegalArgumentExceptione){logger.error(errorMessage{},e.getMessage(),e);}断言配合全局异常处理来用很不错ControllerAdvice(com.test)ResponseBodypublicclassGlobalExceptionHandler{ExceptionHandler(IllegalArgumentException.class)publicStringillegalArgumentExceptionHandler(IllegalArgumentExceptionex){returnex.getMessage();}}完整版代码(包括异常处理)代码JsonResultresultnewJsonResult();StringmethodName定制断言功能_断言工具isEmpty;try{log.info(methodName请求开始request{},JSON.toJSONString(request));Assert.hasLength(request.getName(),名称不能为空);Assert.hasLength(request.getPassword(),密码不能为空);Assert.hasLength(request.getAge(),年龄不能为空);log.info(methodName请求完成result{},JSON.toJSONString(result));returnresult;}catch(IllegalArgumentExceptione){// 注这里虽然是异常但是打失败的日志和不期待的异常区分开log.info(methodName请求失败{},e.getMessage());// 这里的写法注意下去掉error直接用{}returnJsonResult.error(-1,methodName请求失败e.getMessage());}catch(Exceptione){log.error(methodName请求异常error,e);returnJsonResult.error(-1,methodName请求异常errore.getMessage());}效果一目了然不用每个判断都单独写log和返回了集中捕获IllegalArgumentException进行处理即可当然如果全局异常处理那更加方便。判断是否是空字符串Assert.hasLength(,用户名不能为空);相当于StringUtils.isNotEmpty();生产环境为什么不推荐用断言因为断言默认是关闭的如果没有手动开启那么相当于无效容易造成不同环境逻辑不一致留坑。编译和运行的时候要加参数否则编译不通过或者运行无效。javac -source 1.4 AssertTest.java # 编译的时候要加 -source 1.4java -ea AssertTest # 运行的时候要加 -ea在vm中加-ea(enable assert)表示启用断言。在vm中加-da(disable assert)表示禁用断言(实际默认就是禁用)。assert和AssertUtils的区别注这里的assert指的是java关键字assert。AssertUtils指的是封装后Assert工具如spring的Assert类。对比下就比较清楚了—assertAssertUtils是否受环境限制受环境限制默认是关闭不受环境限制报错异常类型为java.lang.AssertionError,Exception捕获不到(这也挺坑的因为一般try catch都是用Exception)异常类型为java.lang.IllegalArgumentException,Exception可以捕获到这就一目了然了assert不好用推荐用Assert工具。Assert工具为什么不受断言开关的影响呢?看下实现代码就明白了Assert工具是用代码模拟出了assert的效果并没有用到assert关键字所以不受assert开关的影响。spring Assert的使用AssertUtils有很多组织都实现了如spring、apache、hutools等。简单看了下spring的用着就可以又不用引入额外包所以就以spring的Assert类为例。判断字符串是否为空用hasLength() 注不是notEmpty()因为notEmpty方法是给数组用的。spring只有Assert这一个实现类吗?自定义断言工具有时第三方提供的断言工具功能不满足我们的要求怎么办?其实可以大胆一点跳出第三方的限制直接自定义工具。因为实现原理很清晰就是校验不通过抛出IllegalArgumentException即可。想通这一点思路一下子宽了很多。另外如果不想把异常分的太细直接捕获Exception也是可以的。自定义断言工具代码也是网上通用的代码/* * 定制断言工具 */publicclassCustomAssertUtils{publicstaticvoidisNotEmpty(Stringstring,Stringmessage){if(!StringUtils.isNotEmpty(string)){thrownewIllegalArgumentException(message);}}publicstaticvoidisSuccess(booleanb,Stringmessage){if(!b){thrownewIllegalArgumentException(message);}}publicstaticvoidcollectionIsNotEmpty(Collectioncollection,Stringmessage){if(CollectionUtils.isEmpty(collection)){thrownewIllegalArgumentException(message);}}publicstaticvoidcollectionIsEmpty(Collectioncollection,Stringmessage){if(!CollectionUtils.isEmpty(collection)){thrownewIllegalArgumentException(message);}}publicstaticvoidobjectIsNotNull(Objectobject,Stringmessage){if(ObjectUtils.isEmpty(object)){thrownewIllegalArgumentException(message);}}publicstaticvoidobjectIsNull(Objectobject,Stringmessage){if(!ObjectUtils.isEmpty(object)){thrownewIllegalArgumentException(message);}}}ReturnAssert工具有时需要return 写if太难看了booleanbReturnAssert.collectionIsEmpty(newArrayList(),message:);if(!b)returnresult;booleanbReturnAssert.collectionIsEmpty(newArrayList(),message:);if(!b)returnresult;