V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wushigejiajia01
V2EX  ›  Java

实际开发中 assert 用的多吗?

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

    我是个后端 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   ·   实用小工具   ·   2944 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:25 · PVG 22:25 · LAX 06:25 · JFK 09:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.