关于断言Assert的使用注意事项

关于断言Assert的使用注意事项


前言

本来想写个全局异常的demo,使用Assert抛出MybatisPlusException异常,但是在使用Assert是发现个问题,故在此记录,防止以后掉坑。


一、Assert的使用

    @RequestMapping(value = "testGlobalException",method = RequestMethod.POST)
    public BaseResponse testGlobalException(@RequestBody Book book){
    	//Assert 断言,判断book.getBookName()为空时抛出异常
        Assert.notNull(book.getBookName(),"书名不能为空");
    
        return new BaseResponse(Msg.SUCCESS);
    }

Assert有点奇怪,这里用的不是isNull,而是 notNull 。如:
判断某个字段为null时,抛出异常:Assert.notNull(book.getBookName(),“书名不能为空”);

从源码分析:
1:book.getBookName()为null,
2:此时object != null 为 false
3:!expression 为 true,故会抛出异常

    public static void notNull(Object object, String message, Object... params) {
        isTrue(object != null, message, params);
    }
    public static void isTrue(boolean expression, String message, Object... params) {
        if (!expression) {
            throw ExceptionUtils.mpe(message, params);
        }
    }

二、注意点

在我目前的公司,传对象时,如果bookName没有值,那么入参是这样的:

{
“bookName”:""
}

此时,object != null 是为 false
!expression 为 false 不会抛出异常
在这里插入图片描述
在这里插入图片描述


总结

1:Assert判断某个字段为空时,抛出异常,用的是 notNull
2: Assert判断"bookName":""这种参数,不等于null。

<think>嗯,用户想了解断言assert在编程语言中的用法和含义。首先,我需要回忆一下自己对assert的理解。断言主要用于调试阶段,检查程序中的条件是否满足,如果不满足就触发错误。这有助于开发者快速定位问题。 根据引用[1],断言在开发和调试阶段很重要,可以插入检查点,验证程序的正确性。同时,在Release版本中可能不会生效,所以不能依赖它处理运行时错误。这点需要强调,避免用户误解。 引用[2]提到C语言中的assert是预处理器宏,语法是assert(expression)。当表达式为假时触发。需要解释不同语言中的实现可能不同,但核心思想一致。 用户可能混淆断言和异常处理,比如用if加异常代替断言。引用[3]讨论了断言和异常的区别,断言用于调试,异常用于运行时错误处理。需要说明两者的适用场景,防止滥用断言。 接下来要组织回答结构,先定义断言,再讲作用,使用方法,注意事项,示例代码。注意使用正确的中文术语,并引用提供的资料。用户可能需要具体例子,所以用Python和C的示例比较好。 还要生成相关问题,比如断言与异常的区别,如何禁用断言,不同语言中的实现差异等。确保问题覆盖用户可能感兴趣的扩展内容。 检查是否遵循了系统指令:行内公式用$...$,独立公式单独成段,正确使用引用标识。需要确认LaTeX语法正确,比如数学表达式是否正确转义。 最后确保回答清晰,分点明确,帮助用户逐步理解断言的概念和使用方法,同时避免技术错误。可能用户是初学者,需要用简单易懂的语言解释,避免过于专业的术语堆砌。</think>### 断言assert)的作用和使用方法 #### 1. **断言的定义与核心作用** 断言assert)是编程语言中用于**调试阶段**的验证工具,其核心作用是通过检查特定条件是否满足,帮助开发者快速定位代码中的逻辑错误或非法状态。 - **开发阶段**:断言作为“安全网”,验证程序假设(例如函数输入范围、中间计算结果等),若条件为假则立即终止程序并报错[^1][^2] - **调试辅助**:断言失败时会提供错误信息(如文件名、行号、表达式内容),帮助开发者快速定位问题[^1][^3] #### 2. **断言使用语法(以常见语言为例)** 不同语言语法略有差异,但核心逻辑一致: - **Python** ```python assert condition, "错误提示信息" # 若condition为False,触发AssertionError并输出提示 ``` - **C/C++** ```c #include <assert.h> assert(condition); // 若condition为0,触发终止并输出表达式内容 ``` #### 3. **断言使用场景** 适用场景: - 验证函数参数合法性(如输入非空、数值范围) - 检查算法中间结果的正确性(如排序后数组是否有序) - 确保代码执行路径符合预期(如状态机的状态切换) 不适用场景: - 用户输入验证(应使用`if`+异常处理) - 外部资源检查(如文件是否存在、网络连接) - 生产环境错误处理(断言可能在发布版本中被禁用)[^1] #### 4. **断言注意事项** - **不可替代异常处理**:断言用于调试阶段的“不可恢复错误”,而异常处理用于运行时可预见的错误[^3] - **避免副作用**:断言表达式不应包含业务逻辑(如`assert(func())`可能因断言禁用导致行为不一致) - **发布版本行为**:部分语言(如C/C++)通过`NDEBUG`宏禁用断言,Python可通过`-O`优化选项禁用[^1][^2] --- ### 代码示例 ```python def calculate_average(numbers): assert len(numbers) > 0, "输入列表不能为空" # 验证输入合法性 total = sum(numbers) average = total / len(numbers) assert isinstance(average, float), "计算结果类型错误" # 验证输出类型 return average ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值