java.lang.NumberFormatException: For input string: ““ 问题解决

项目启动正常但swagger页面报错,问题为swagger(2.9.2)依赖swagger-models(1.5.20)导致对象非string属性被赋予空字符串,解决办法是添加1.5.20以上版本的swagger-models依赖。

问题复现

项目启动后正常运行,但是进入swagger页面或者刷新swagger控制台就会报这个错误,由此判断错误与swagger有关。


java.lang.NumberFormatException: For input string: “”

这个问题是由swagger引起的。

问题的意思是空字符串转数值类型出错。


解决方法:

添加swagger-models(1.5.21)依赖

<dependency>
	<groupId>io.swagger</groupId>
	<artifactId>swagger-models</artifactId>
	<version>1.5.21</version>
</dependency>

问题分析

swagger(2.9.2)版本依赖swagger-models(1.5.20),此版本的swagger-models会将对象的非string类型属性默认赋值为空字符串,导致这个错误的出现。
所以只要添加(1.5.20)以上版本的的swagger-models依赖即可。

<think>我们收到了一个关于Java中`java.lang.NumberFormatException: For input string`异常的问题。这个异常通常在尝试将字符串转换为数值类型(如int、double等)时发生,因为字符串的格式不符合数值的要求。我们将根据引用内容,系统地分析原因并提供解决方案。 ### 异常原因分析 根据引用[1][2][3][4][5],该异常主要由以下原因触发: 1. **字符串含有非数字字符**(最常见) 当字符串中包含字母、符号等非数字内容时,转换会失败。例如: ```java Integer.parseInt("123abc"); // 抛出异常,因为含有字母 ``` 2. **空字符串或null值** 尝试转换空字符串`""`或`null`会引发异常: ```java Integer.parseInt(""); // 抛出异常 ``` 3. **数值超出目标类型的范围** 例如,将超过`Integer.MAX_VALUE`(2147483647)的字符串转为int: ```java Integer.parseInt("2147483648"); // 超出int范围,抛出异常 ``` 4. **进制转换错误** 使用`Integer.parseInt(String s, int radix)`时,字符串必须符合指定进制(如16进制只能包含0-9, a-f)。例如: ```java Integer.parseInt("202505050302", 16); // 错误!字符串包含'20'等非16进制字符[^3] ``` 5. **特殊符号处理不当(如MyBatis/OGNL场景)** 在MyBatis动态SQL中,`!`符号在OGNL表达式中会被错误解析为数字类型,引发异常[^4]: ```xml <!-- 错误示例:OGNL将'!'解析为数字 --> <if test="phone == '!'"> <!-- 抛出异常 --> ``` ### 解决方案与代码示例 #### 1. 基础防御:使用`try-catch`处理异常 在转换前无法确保字符串格式时,捕获异常并设置默认值: ```java try { int num = Integer.parseInt(input); } catch (NumberFormatException e) { num = 0; // 提供默认值 System.err.println("转换失败: " + e.getMessage()); } ``` #### 2. 转换前预校验字符串 使用正则表达式或工具类提前检查: ```java // 检查是否为整数 public static boolean isInteger(String str) { return str != null && str.matches("[-+]?\\d+"); // 允许正负号 } // 使用示例 if (isInteger(input)) { int num = Integer.parseInt(input); } ``` #### 3. 处理进制转换问题 确保字符串符合目标进制规则。例如,将MAC地址转为16进制数字时: ```java String address = "20:25:05:05:03:02"; String hexStr = address.replace(":", ""); // 移除冒号,得到"202505050302" // 错误!16进制字符串长度必须为偶数,且每两位代表一个字节 // 正确做法:先验证是否为合法16进制数 if (hexStr.matches("[0-9a-fA-F]+")) { long num = Long.parseLong(hexStr, 16); // 使用long避免溢出 } ``` #### 4. MyBatis/OGNL中特殊符号处理 在MyBatis动态SQL中,避免`!`被解析为数字类型: ```xml <!-- 方法1:使用.toString()转换 --> <if test="phone != null and phone == '!'.toString()"> AND a.phone != '' </if> <!-- 方法2:使用双引号包裹感叹号 --> <if test='phone != null and phone == "!"'> AND a.phone != '' </if> ``` #### 5. 大数值处理 当字符串可能超出int范围时,改用`Long.parseLong()`或`BigInteger`: ```java String bigNum = "99999999999999999999"; try { long num = Long.parseLong(bigNum); // 仍可能超出long范围 } catch (NumberFormatException e) { BigInteger bigInt = new BigInteger(bigNum); // 使用BigInteger } ``` ### 调试建议 1. **打印输入字符串**:在转换前输出字符串值,确认其内容。 2. **边界测试**:传入空字符串、null、特殊符号等验证健壮性。 3. **使用工具类**:如Apache Commons Lang的`NumberUtils`: ```java // 转换失败返回默认值 int num = NumberUtils.toInt(input, 0); ``` --- §§ 相关问题§§ 1. 如何在Java中安全地将字符串转换为浮点数? 2. MyBatis动态SQL中还有哪些容易引发异常的符号? 3. 使用正则表达式校验数值格式有哪些注意事项? 4. `BigInteger`和`BigDecimal`在处理大数值时有何区别? 通过以上方法,可有效避免`NumberFormatException`异常,确保字符串到数值的安全转换[^1][^2][^3][^4][^5]。 </think>### Java 中 `java.lang.NumberFormatException: For input string` 异常的原因与解决方案 #### 🔍 **异常原因详解** 根据引用内容分析,该异常发生在字符串到数值类型的转换过程中,主要原因包括: 1. **包含非法字符**(最常见) 字符串包含非数字字符(字母、符号等),例如: ```java Integer.parseInt("123abc"); // 抛出异常:含字母 Double.parseDouble("12.34%"); // 抛出异常:含% ``` 2. **空值或空白字符串** 试图转换空字符串或空白值: ```java Integer.parseInt(""); // 空字符串 Integer.parseInt(null); // null值 ``` 3. **数值超出范围** 字符串表示的数字超出目标类型范围: ```java Integer.parseInt("2147483648"); // 超出int最大值(2147483647) ``` 4. **进制不匹配** 使用 `parseInt(String s, int radix)` 时字符串不符合指定进制规则: ```java // 16进制字符串包含非法字符(G-Z) Integer.parseInt("GHIJKL", 16); // 抛出异常[^3] ``` 5. **特殊符号解析问题**(MyBatis/OGNL场景) 在动态SQL中特殊符号如 `!` 被错误解析为数字类型: ```xml <!-- OGNL会将'!'解析为数字导致异常 --> <if test="phone == '!'"> <!-- 错误写法 --> [^4] ``` #### 🛠️ **解决方案** ##### 1. 基础防御:使用 `try-catch` 处理 ```java try { int num = Integer.parseInt(input); } catch (NumberFormatException e) { // 异常处理方案: num = 0; // 方案1:提供默认值 System.err.println("无效输入: " + input); // 方案2:记录日志 throw new CustomException("格式错误"); // 方案3:转换异常类型 } ``` ##### 2. 转换前预校验字符串 ```java // 检查整数格式 public static boolean isValidInteger(String str) { return str != null && str.matches("-?\\d+"); // 匹配正负整数 } // 使用示例 if (isValidInteger(input)) { int num = Integer.parseInt(input); } ``` ##### 3. 特殊场景处理 **处理进制转换**(如MAC地址转数字): ```java String mac = "20:25:05:05:03:02"; String hex = mac.replace(":", ""); // 验证16进制格式 if (hex.matches("[0-9a-fA-F]+")) { long value = Long.parseLong(hex, 16); // 使用long防溢出 } ``` **MyBatis/OGNL 解决方案**: ```xml <!-- 正确写法1:使用.toString() --> <if test="phone == '!'.toString()"> <!-- 安全转换 --> [^4] AND a.phone != '' </if> <!-- 正确写法2:双引号包裹特殊符号 --> <if test='phone == "!"'> <!-- 避免OGNL误解析 --> [^4] AND a.phone != '' </if> ``` ##### 4. 工具类替代方案 ```java // 使用 Apache Commons Lang import org.apache.commons.lang3.math.NumberUtils; int num = NumberUtils.toInt(input, 0); // 转换失败返回默认值0 // 使用 Guava import com.google.common.primitives.Ints; Integer num = Ints.tryParse(input); // 失败返回null ``` ##### 5. 大数值处理 ```java String bigNum = "99999999999999999999"; try { BigInteger bigInt = new BigInteger(bigNum); // 使用BigInteger } catch (NumberFormatException e) { // 处理异常 } ``` #### 💡 最佳实践建议 1. **输入验证优先**:转换前使用正则验证格式(推荐模式:`String.matches()`) 2. **明确处理空值**:添加 `if (input == null || input.isEmpty())` 检查 3. **边界值测试**:特别测试 `0`、`负值`、`最大值+1` 等边界情况 4. **日志记录**:在 catch 块中记录无效输入的具体值 5. **文档标注**:对接收数字参数的 API 注明格式要求 > **关键原则**:所有数值转换操作必须考虑异常处理,不能假设输入合法性[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值