实际开发中 assert 用的多吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wushigejiajia01
V2EX    Java

实际开发中 assert 用的多吗?

  •  
  •   wushigejiajia01 2020-07-23 09:34:04 +08:00 6501 次点击
    这是一个创建于 1911 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是个后端 JAVA 开发, 搬砖三年多了

    基本没看到有人用过 Assert, 最近在看一个项目中的代码, 发现有人用 Assert

    百度查了一下才知道这个东西的作用, 初步理解就是 if...else 的另一种写法

    关键这个东西已经被划上横线, 不建议使用了

    我搜了一下这个项目里用的不算少, 大多是在 service 层入参的时候使用的, 这样有什么问题吗?

    大家在实际发中用的多吗? 有什么需要注意的呢?

    38 条回复    2020-09-29 02:39:34 +08:00
    BrettD
        1
    BrettD  
       2020-07-23 09:36:46 +08:00
    C/C++工程里面感觉用的还是挺多的
    securityCoding
        2
    securityCoding  
       2020-07-23 09:39:32 +08:00
    基本都在单元测试中使用 , 业务中都是抛出明确的自定义异常
    wushigejiajia01
        3
    wushigejiajia01  
    OP
       2020-07-23 09:42:10 +08:00
    @securityCoding
    我现在看的这个项目中 大多是下面这样的用法
    Assert.notNull(projectId);

    其中 notnull 还是被横线划掉不推荐使用的状态......不知道这样是否合适
    BBCCBB
        4
    BBCCBB  
       2020-07-23 09:45:15 +08:00
    > Assert.notNull(projectId);

    > 其中 notnull 还是被横线划掉不推荐使用的状态......不知道这样是否合适


    这个主要是需要指定第二个参数, 写一个提示信息, 不然只会报一个空指针. 排查不了问题, 这个 Assert 相当于白写.
    Vegetable
        5
    Vegetable  
       2020-07-23 09:45:49 +08:00
    可以说不应该用吧,某些语言甚至可以直接在运行时屏蔽 Assert,这东西不应该出现在逻辑中,应该是调试工具。
    palmers
        6
    palmers  
       2020-07-23 09:47:03 +08:00
    业务代码中很少直接使用的 ,一般都是包装一个类似的工具 比如 spring 源码里 自己包装了对象的各种判断 空和参数错误, 如果通过返回原值, 否则抛对应的异常 这样代码看起来会很简洁明了 不会在主线中添加很多校验判断
    Jrue0011
        7
    Jrue0011  
       2020-07-23 10:12:38 +08:00
    你用的应该是某个类名 Assert 的工具类,而不是Java 自己提供的 assert 关键字? Java 的 assert 关键字貌似网上都说不推荐使用,工具类一半是可以的。
    至于你说的划横线是因为方法上有 @Deprecated 注解所以 IDE 提示你方法过时吧,一般这种情况源码注释里都有推荐替代的方法。
    zsdroid
        8
    zsdroid  
       2020-07-23 10:13:51 +08:00
    被横线划掉不推荐使用,因为推荐传第二个参数。比如`Assert.isNull(editDto.getId(), "请输入 id");`
    zsdroid
        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)}
    */
    glaucus
        10
    glaucus  
       2020-07-23 10:17:20 +08:00
    参数校验当然有更优雅的做法了,尤其是在 Spring 里
    zsdroid
        11
    zsdroid  
       2020-07-23 10:19:04 +08:00
    多看源码吧。
    一般在 Deprecated 一个方法的时候,会在注释中写明,为什么不推荐,用什么方法代替。
    chihiro2014
        12
    chihiro2014  
       2020-07-23 10:19:28 +08:00
    Spring 中用得很多
    meeop
        13
    meeop  
       2020-07-23 10:53:20 +08:00
    不会用,严重不推荐
    对于异常数据,应该在上线前作为 bug 休掉,对于可能的异常数据(如表单数据校验),应该抛出包装好更友善的异常并日志
    assert 只是在单元测试,或者项目初期测试用
    dcty
        14
    dcty  
       2020-07-23 11:06:19 +08:00
    我一般用在非 release 环境下
    Jonz
        15
    Jonz  
       2020-07-23 11:09:46 +08:00
    只推荐在调试的时候使用?
    byzf
        16
    byzf  
       2020-07-23 14:50:49 +08:00
    上面估计都是客户端. 服务端还是要用的, 服务端有时候保证进程会崩溃是很关键的.
    wongy
        17
    wongy  
       2020-07-23 15:06:07 +08:00   2
    Assert.notNull(obj, message);
    在我构建的项目中经常使用,里面包装自己的业务异常,然后由统一业务异常处理器解释并返回提示内容;
    在少数参数校验、检查数据库查询返回、流程必要参数检查 非常实用。
    across
        18
    across  
       2020-07-23 15:08:25 +08:00
    自己做模块时不会加么
    不过 release 不给放,反正触发了就是有 bug 。
    Vegetable
        19
    Vegetable  
       2020-07-23 15:12:53 +08:00
    @byzf #16 关键 assert 和 if...throw 其实是一样的吧,而且更方便上级根据不同的 exception 处理,所以不推荐这个
    tantalu
        20
    tantalu  
       2020-07-23 15:55:25 +08:00
    一般用这个 Objects.requireNonNull()
    mahogany
        21
    mahogany  
       2020-07-23 17:10:27 +08:00
    线上用过。有时候不得不断言一些基本情况,如果输入有问题直接抛出错误(太懒,不想定义 Exception...)
    egfegdfr
        22
    egfegdfr  
       2020-07-23 17:45:28 +08:00
    用过一段时间了,感觉很好用,可以让代码更简洁。减少 if .... else 嵌套
    qwerthhusn
        23
    qwerthhusn  
       2020-07-23 18:05:59 +08:00
    工作三年多了,不应该连这个都不知道啊。

    Assert.xxx ,这个被画横线,一般用的是 Spring 提供的工具类。
    画横线的意思是,不是不推荐用,而是后面需要提供一个 message 。。。
    qwerthhusn
        24
    qwerthhusn  
       2020-07-23 18:06:34 +08:00
    鼠标放上去看提示或者点进去看源码 Javadoc 的提示
    pigspy
        25
    pigspy  
       2020-07-23 18:12:39 +08:00
    源码里面有很多啊
    aguesuka
        26
    aguesuka  
       2020-07-23 19:05:00 +08:00 via Android
    我怀疑我和楼上用的不是一个语言。谈起 assert 不应该是 assert 布尔表达式:错误提示吗?
    aguesuka
        28
    aguesuka  
       2020-07-23 20:10:18 +08:00 via Android
    你怎么知道是楼主说的是 spring 的
    GrayXu
        29
    GrayXu  
       2020-07-23 20:20:17 +08:00 via Android
    第一次写的时候用吧,因为不是写一小段就能测试,有 assert 在 debug 时候方便定位些
    abc612008
        30
    abc612008  
       2020-07-23 21:37:07 +08:00
    都不写测试的吗……
    sun1993
        31
    sun1993  
       2020-07-23 21:42:04 +08:00
    做 UT 会用,不过现在用 mokito,也不太用 java 原生的断言了。。
    zsdroid
        32
    zsdroid  
       2020-07-23 22:58:44 +08:00
    @aguesuka #28 见 3 楼
    beiwei2008
        33
    beiwei2008  
       2020-07-23 22:59:26 +08:00
    @egfegdfr assert 怎么用于减少 if .... else 嵌套呢?不是测试的时候直接抛出异常程序结束运行吗?你说的是 java 还是其他语言?
    egfegdfr
        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
    atonku
        35
    atonku  
       2020-07-24 11:22:23 +08:00
    不用
    yjxjn
        36
    yjxjn  
       2020-07-26 11:27:21 +08:00
    单元测试经常用啊。
    xixinimei
        37
    xixinimei  
       2020-09-29 02:38:53 +08:00
    单元测试常用。Assert 抛出的是 Error,和 Exception,除非你需要的是 Error,而不是 Exception
    xixinimei
        38
    xixinimei  
       2020-09-29 02:39:34 +08:00
    @xixinimei 更正,“不是 Exception”
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     985 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:58 PVG 06:58 LAX 15:58 JFK 18:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86