Kotlin when语句in范围匹配负数失效仅走else分支问题
问题现象
- 功能测试时硬编码传入
-3.0作为when语句的判断入参,运行结果始终返回0,未命中对应范围分支,仅执行else语句 - 传入正数值时
in范围匹配逻辑运行完全正常,仅传入负数值时会出现匹配失效问题 - 问题运行参考截图:

问题根因
这是动态表达式解析的典型坑,常见于MyBatis动态SQL、轻量规则引擎的when判断场景:
当in范围的候选值直接以负数形式写在表达式里时,解析器会优先把数值前的-识别为减法运算符,而非负号标记,导致整个范围判断表达式解析出错,静默返回false,自然不会命中对应分支,最终走到else逻辑返回0。
正数值因为没有前置的歧义符号,不会触发解析错误,所以匹配逻辑完全正常。
修复方法
直接给in范围内的负数单独加括号,强制解析器将其识别为数值字面量即可消除歧义,示例写法如下:
// 错误写法,负号会被误判为减号 when (val in (-5, 0)) { ret = 1 } // 正确写法,负数加括号消除解析歧义 when (val in ((-5), 0)) { ret = 1 }
如果是直接在数据库层面执行原生SQL的case when语句,不会出现这类解析问题,该问题仅存在于自带表达式解析逻辑的上层框架/脚本场景。
内容的提问来源于stack exchange,提问作者RaJ
相关产品推荐
相关产品推荐

