Mybatis java.lang.NumberFormatException: For input string: "1,2" 问题处理

简介: 【8月更文挑战第9天】Mybatis java.lang.NumberFormatException: For input string: "1,2" 问题处理

问题背景

今天在开发过程中,项目请求报了一个错,错误信息【java.lang.NumberFormatException: For input string: "1,2"】,最初看到这个报错还挺奇怪的,在Mybatis xml 中比较值双方都是字符串,但是为什么会出现一个字符串强转数值类型的报错。后来查找了相关文档,找到了具体原因,那么由于之前未曾遇到类似情况,这里便记录一下问题解决方案。

问题分析

报错位置 Mybatis xml 代码如下,Mybatis 在进行参数 == 比较时,会将常量类型的 '1' 强转为数值类型进行比较,而 params.selectParam 的参数内容是 String 类型,这样导致 Mybatis 比较失败,当遇到 '1,2' 时,则会直接报错 java.lang.NumberFormatException: For input string: "1,2"  ,强转数值类型失败

<choose>
            <when test="params.selectParam == '1'">
                GROUP BY t2.channel_type
            </when>
            <when test="params.selectParam == '2'">
                GROUP BY t3.dept_id
            </when>
            <when test="params.selectParam == '1,2'">
                GROUP BY t2.channel_type,t3.dept_id
            </when>
            <otherwise>
                GROUP BY t2.channel_type
            </otherwise>
        </choose>

问题处理

找到问题了,那么此时就有两种解决方案:

一种是将常量类型的 '1' 通过 .toString() 转为 String 类型,这样就可以与 params.selectParam 的参数内容是 String 类型的内容进行正常比较了

<choose>
    <when test="params.selectParam == '1'.toString()">
      GROUP BY t2.channel_type
    </when>
    <when test="params.selectParam == '2'.toString()">
      GROUP BY t3.dept_id
    </when>
    <when test="params.selectParam == '1,2'.toString()">
      GROUP BY t2.channel_type,t3.dept_id
    </when>
    <otherwise>
      GROUP BY t2.channel_type
    </otherwise>
</choose>

另一种方案就是修改 test="params.selectParam == '1'"  的 "" 变 '' ,而内部常量值的 ''  变成 "",处理后就是这样了

<choose>
    <when test='params.selectParam == "1"'>
      GROUP BY t2.channel_type
    </when>
    <when test='params.selectParam == "2"'>
      GROUP BY t3.dept_id
    </when>
    <when test='params.selectParam == "1,2"'>
      GROUP BY t2.channel_type,t3.dept_id
    </when>
    <otherwise>
      GROUP BY t2.channel_type
    </otherwise>
</choose>

这种方案也是可行的,亲测有效,大家遇到这样的问题也可以采用上述两种方案中的一种,不过个人推荐使用第一种方案,代码比较清晰可见。采用第二种方案的话,对于后期维护人员可能会不太容易注意到这 "" 和  '' 的差异。

相关文章
|
1月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
273 5
|
2月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
205 3
|
3月前
|
存储 SQL 缓存
Java字符串处理:String、StringBuilder与StringBuffer
本文深入解析Java中String、StringBuilder和StringBuffer的核心区别与使用场景。涵盖字符串不可变性、常量池、intern方法、可变字符串构建器的扩容机制及线程安全实现。通过性能测试对比三者差异,并提供最佳实践与高频面试问题解析,助你掌握Java字符串处理精髓。
|
4月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
339 14
|
8月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
240 11
|
8月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
259 9
|
11月前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
178 2
Java 中的 String Pool 简介
|
11月前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
254 1
|
11月前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
286 1
java 为什么 String 在 java 中是不可变的?