我是个后端 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 2
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
|