java.lang.NumberFormatException: For input string: "9004@19004" 的解决办法

本文解决了一个在使用最新版本Redis集群时遇到的与Jedis客户端版本不兼容的问题。作者最初使用Jedis 2.7.0版本,在尝试连接Redis集群时遇到了NumberFormatException异常。经过一番排查,最终通过升级Jedis到2.9.0版本解决了问题,并介绍了如何适配新版本所需的commons-pool2依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



这个是在搭建Redis缓存服务,并通过Spring集成Redis。

集成完成后在Java中使用JedisClients进行测试连接时遇到的问题:
java.lang.NumberFormatException: For input string: "9004@19004"


如下图:




首先我最终解决是由于Redis与JedisClient之间的版本兼容问题导致的!!!

关于这个问题,我用时比较长,期间找了很多的这方面的大佬,但是搞来搞去,还是没有解决。在第二天下班的时候,突然灵感来了,然后就解决咯!不管你相不相信,反正我是相信了。。。


首先明确一下我的 Redis 服务环境:Centos7、Redis-4.0.2

Java 中使用的 JedisClient 版本:jedis-2.7.0,而 commons-pool2 使用的是  jedis 中的。


问题来了,jedis-2.7.0 测试单机版能成功,但是在获取集群测试时报如上错误信息;

这个是由于版本的兼容问题导致的,其中 Redis 使用的为最新版本,Jedis 也需要用最新的版本;

最后我修改为jedis-2.9.0版本的测试通过了;

注意:在 jedis-2.9.0 以后,好像将 commons-pool2 提取出来了,需要额外的导入 commons-pool2 的 jar 包,

而在 jedis-2.7.0 之前就单独的导入一个 jedis 包即可!!!

这如果你也是用的最新版本 Redis 服务,这儿提供了 最新版本的 jedis 、commons-pool2 的 jar 包下载:

commons-pool2-2.5.0 优快云下载

jedis-2.9.0 最新版Redis客户端优快云下载










如果写的不到的地方,望指正!


<think>我们正在处理一个Java中的NumberFormatException异常问题。用户遇到了一个具体的错误:`java.lang.NumberFormatException: For input string: "测试"`。这意味着程序试图将字符串"测试"转换为数字,但显然这个字符串不是有效的数字表示。 根据引用内容,我们可以总结出以下常见原因和解决方法: 1. **字符串内容非数字**:尝试转换的字符串包含非数字字符(如"测试")。需要确保字符串只包含数字字符(可能还包括正负号、小数点等,具体取决于目标类型)。 2. **空字符串或空白字符串**:引用[2]中提到,当尝试将空字符串`""`转换为数字时也会抛出此异常。需要检查字符串是否为空或空白。 3. **格式问题**:引用[3]中提到,在OGNL表达式中使用特殊字符(如'!')可能导致问题,需要调整表达式或进行字符串转换。 4. **框架或库的特定问题**:如引用[2]中提到的Swagger问题,由于未设置example值导致类型转换异常。 针对用户的具体问题(字符串为"测试"),显然是因为字符串内容不是数字。解决方法包括: - 在转换之前,验证字符串是否为有效数字。 - 使用try-catch捕获异常并处理。 此外,我们还可以提供一些通用的预防和处理此异常的方法。 下面我将逐步给出解决方案。</think>### `NumberFormatException` 异常解决方案 您遇到的 `java.lang.NumberFormatException: For input string: "测试"` 异常表示程序尝试将非数字字符串 `"测试"` 转换为数值类型。以下是系统化的解决方案: #### 1. **核心原因分析** - **根本问题**:Java 的数值转换方法(如 `Integer.parseInt()`)要求输入必须是纯数字格式 - **错误示例**: ```java String input = "测试"; // 包含中文字符 int num = Integer.parseInt(input); // 触发异常 ``` #### 2. **通用解决方案** ```java // 方案1:预校验数字格式(推荐) public static int safeConvert(String input) { if (input == null || !input.matches("\\d+")) { // 正则验证纯数字 return 0; // 返回默认值或抛出自定义异常 } return Integer.parseInt(input); } // 方案2:try-catch 捕获异常 try { int num = Integer.parseInt("测试"); } catch (NumberFormatException e) { System.err.println("转换失败: " + e.getMessage()); // 处理异常逻辑 } ``` #### 3. **特殊场景处理** - **框架特定问题**(参考引用[2][3]): - **Swagger 报错**:检查数字字段是否设置 `example` 值 ```java @ApiModelProperty(example = "10") // 必须添加示例值 private Integer quantity; ``` - **MyBatis OGNL 表达式**:避免使用 `!` 符号 ```xml <!-- 错误写法 --> <if test="flag != !1"> <!-- 正确修正 --> <if test='flag != "1"'> <!-- 改用双引号 --> ``` #### 4. **预防措施** 1. **输入验证**:前端/客户端提交数据时进行数字格式过滤 2. **日志监控**:记录转换失败的原始数据 ```java logger.warn("非法数值输入: {}", inputString); ``` 3. **使用工具类**: ```java NumberUtils.toInt("123", 0); // Apache Commons Lang ``` > **关键原则**:所有外部输入(用户输入/API参数/数据库字段)在转换前必须验证格式[^1][^2]。当遇到中文等非数字字符时,`parseInt()` 必然抛出异常[^3]。 --- ### 相关问题 1. 如何批量验证一组字符串是否为有效数字? 2. `NumberFormatException` 和 `NullPointerException` 在数值转换中如何处理优先级? 3.Spring Boot 中如何全局处理数值转换异常? 4. 不同进制(如十六进制)字符串如何安全转换为数字? [^1]: 数值转换前必须进行格式验证 [^2]: 框架特定问题需检查配置示例值 [^3]: OGNL 表达式需避免特殊符号冲突
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechBro华仔

日拱一卒无有尽,功不唐捐终入海

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值