我是个后端 JAVA 开发, 搬砖三年多了
基本没看到有人用过 Assert, 最近在看一个项目中的代码, 发现有人用 Assert
百度查了一下才知道这个东西的作用, 初步理解就是 if...else 的另一种写法
关键这个东西已经被划上横线, 不建议使用了
我搜了一下这个项目里用的不算少, 大多是在 service 层入参的时候使用的, 这样有什么问题吗?
大家在实际发中用的多吗? 有什么需要注意的呢?
![]() | 1 BrettD 2020-07-23 09:36:46 +08:00 C/C++工程里面感觉用的还是挺多的 |
2 securityCoding 2020-07-23 09:39:32 +08:00 基本都在单元测试中使用 , 业务中都是抛出明确的自定义异常 |
![]() | 3 wushigejiajia01 OP @securityCoding 我现在看的这个项目中 大多是下面这样的用法 Assert.notNull(projectId); 其中 notnull 还是被横线划掉不推荐使用的状态......不知道这样是否合适 |
![]() | 4 BBCCBB 2020-07-23 09:45:15 +08:00 > Assert.notNull(projectId); > 其中 notnull 还是被横线划掉不推荐使用的状态......不知道这样是否合适 这个主要是需要指定第二个参数, 写一个提示信息, 不然只会报一个空指针. 排查不了问题, 这个 Assert 相当于白写. |
![]() | 5 Vegetable 2020-07-23 09:45:49 +08:00 可以说不应该用吧,某些语言甚至可以直接在运行时屏蔽 Assert,这东西不应该出现在逻辑中,应该是调试工具。 |
![]() | 6 palmers 2020-07-23 09:47:03 +08:00 业务代码中很少直接使用的 ,一般都是包装一个类似的工具 比如 spring 源码里 自己包装了对象的各种判断 空和参数错误, 如果通过返回原值, 否则抛对应的异常 这样代码看起来会很简洁明了 不会在主线中添加很多校验判断 |
![]() | 7 Jrue0011 2020-07-23 10:12:38 +08:00 你用的应该是某个类名 Assert 的工具类,而不是Java 自己提供的 assert 关键字? Java 的 assert 关键字貌似网上都说不推荐使用,工具类一半是可以的。 至于你说的划横线是因为方法上有 @Deprecated 注解所以 IDE 提示你方法过时吧,一般这种情况源码注释里都有推荐替代的方法。 |
![]() | 8 zsdroid 2020-07-23 10:13:51 +08:00 被横线划掉不推荐使用,因为推荐传第二个参数。比如`Assert.isNull(editDto.getId(), "请输入 id");` |
![]() | 9 zsdroid 2020-07-23 10:17:10 +08:00 /** * Assert that an object is not {@code null}. * @deprecated as of 4.3.7, in favor of {@link #notNull(Object, String)} */ |
![]() | 10 glaucus 2020-07-23 10:17:20 +08:00 参数校验当然有更优雅的做法了,尤其是在 Spring 里 |
![]() | 11 zsdroid 2020-07-23 10:19:04 +08:00 多看源码吧。 一般在 Deprecated 一个方法的时候,会在注释中写明,为什么不推荐,用什么方法代替。 |
12 chihiro2014 2020-07-23 10:19:28 +08:00 Spring 中用得很多 |
![]() | 13 meeop 2020-07-23 10:53:20 +08:00 不会用,严重不推荐 对于异常数据,应该在上线前作为 bug 休掉,对于可能的异常数据(如表单数据校验),应该抛出包装好更友善的异常并日志 assert 只是在单元测试,或者项目初期测试用 |
14 dcty 2020-07-23 11:06:19 +08:00 我一般用在非 release 环境下 |
15 Jonz 2020-07-23 11:09:46 +08:00 只推荐在调试的时候使用? |
![]() | 16 byzf 2020-07-23 14:50:49 +08:00 上面估计都是客户端. 服务端还是要用的, 服务端有时候保证进程会崩溃是很关键的. |
![]() | 17 wongy 2020-07-23 15:06:07 +08:00 ![]() Assert.notNull(obj, message); 在我构建的项目中经常使用,里面包装自己的业务异常,然后由统一业务异常处理器解释并返回提示内容; 在少数参数校验、检查数据库查询返回、流程必要参数检查 非常实用。 |
18 across 2020-07-23 15:08:25 +08:00 自己做模块时不会加么 不过 release 不给放,反正触发了就是有 bug 。 |
![]() | 19 Vegetable 2020-07-23 15:12:53 +08:00 @byzf #16 关键 assert 和 if...throw 其实是一样的吧,而且更方便上级根据不同的 exception 处理,所以不推荐这个 |
20 tantalu 2020-07-23 15:55:25 +08:00 一般用这个 Objects.requireNonNull() |
21 mahogany 2020-07-23 17:10:27 +08:00 线上用过。有时候不得不断言一些基本情况,如果输入有问题直接抛出错误(太懒,不想定义 Exception...) |
22 egfegdfr 2020-07-23 17:45:28 +08:00 用过一段时间了,感觉很好用,可以让代码更简洁。减少 if .... else 嵌套 |
![]() | 23 qwerthhusn 2020-07-23 18:05:59 +08:00 |
![]() | 24 qwerthhusn 2020-07-23 18:06:34 +08:00 鼠标放上去看提示或者点进去看源码 Javadoc 的提示 |
25 pigspy 2020-07-23 18:12:39 +08:00 源码里面有很多啊 |
26 aguesuka 2020-07-23 19:05:00 +08:00 via Android 我怀疑我和楼上用的不是一个语言。谈起 assert 不应该是 assert 布尔表达式:错误提示吗? |
![]() | 27 zsdroid 2020-07-23 19:16:26 +08:00 |
28 aguesuka 2020-07-23 20:10:18 +08:00 via Android 你怎么知道是楼主说的是 spring 的 |
29 GrayXu 2020-07-23 20:20:17 +08:00 via Android 第一次写的时候用吧,因为不是写一小段就能测试,有 assert 在 debug 时候方便定位些 |
30 abc612008 2020-07-23 21:37:07 +08:00 都不写测试的吗…… |
![]() | 31 sun1993 2020-07-23 21:42:04 +08:00 做 UT 会用,不过现在用 mokito,也不太用 java 原生的断言了。。 |
33 beiwei2008 2020-07-23 22:59:26 +08:00 @egfegdfr assert 怎么用于减少 if .... else 嵌套呢?不是测试的时候直接抛出异常程序结束运行吗?你说的是 java 还是其他语言? |
34 egfegdfr 2020-07-24 09:39:25 +08:00 @beiwei2008 我说的 assert 应该和你理解的不一样,我这个是自定义的 assert,和自定义异常以及异常全局处理统一使用,可以减少代码量 eg: if (a==null) { throw new xxxException("sfsdfsdfsd") } // dosomething 用自定义 assert 可以这么写: xxxassert.isnull(a,"这里是错误信息") // dosomething |
![]() | 35 atonku 2020-07-24 11:22:23 +08:00 不用 |
![]() | 36 yjxjn 2020-07-26 11:27:21 +08:00 单元测试经常用啊。 |
37 xixinimei 2020-09-29 02:38:53 +08:00 单元测试常用。Assert 抛出的是 Error,和 Exception,除非你需要的是 Error,而不是 Exception |