Java中字符串转int最常用方法是Integer.parseInt(),要求纯数字字符串(可带正负号),空格需trim(),仅支持十进制,超范围或格式错误抛NumberFormatException。

Java 中把字符串转成 int 的最常用方法是 Integer.parseInt()
这是最直接、性能最好的方式,底层不创建多余对象,适合大多数场景。它要求输入必须是纯数字字符串(可带正负号),否则抛出 NumberFormatException。
常见错误现象:Integer.parseInt("123abc") 或 Integer.parseInt("") 或 Integer.parseInt(" 123") 都会直接崩溃。
- 空格要提前用
trim()处理,比如Integer.parseInt(s.trim()) - 只接受十进制,
Integer.parseInt("0xFF", 16)才能解析十六进制 - 范围必须在
Integer.MIN_VALUE到Integer.MAX_VALUE之间,超限也报NumberFormatException
需要默认值时用 Integer.valueOf() 配合 try-catch 更安全
Integer.valueOf() 和 parseInt() 行为几乎一致,区别在于前者返回 Integer 包装类(有缓存机制),后者返回基本类型 int。但真正关键的是:它们都不提供默认值机制,必须自己包一层逻辑。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 不要写
Integer.valueOf(s) != null ? ... : 0—— 它根本不会返回null,非法输入直接抛异常 - 正确做法是捕获
NumberFormatException,例如:int result = 0; try { result = Integer.parseInt(s); } catch (NumberFormatException e) { // 记录日志或按需处理 } - 如果频繁调用且多数输入合法,用 try-catch 影响极小;若非法率高,先用正则预检(如
s.matches("-?\\d+"))可能更省
Spring 或 Apache Commons 场景下可借助工具类避免重复写 try-catch
如果你项目已引入 spring-core,可以用 org.springframework.util.NumberUtils 的 parseNumber() 或封装好的 convertNumberToTargetClass();若用 commons-lang3,推荐 org.apache.commons.lang3.math.NumberUtils.toInt(String, int)。
例如:NumberUtils.toInt("abc", -1) 直接返回 -1,不抛异常。
- 注意:这些工具类内部仍是 try-catch,只是帮你封装了,默认值逻辑清晰,适合配置解析、Web 参数绑定等容忍脏数据的场景
- 不要误以为它们能处理科学计数法(如
"1.23e4")——它们只认整数格式,浮点型得用Double.parseDouble()或对应工具方法 - 依赖增加意味着启动和类加载开销略增,纯 CLI 工具类项目不建议只为一个转换引入整个 commons
大数字或不确定精度时别硬转 int,优先考虑 BigInteger 或校验长度
用户输入 “9999999999” 看似像整数,但已超出 int 范围(最大 2147483647)。强行 parseInt() 会抛异常,而 Long.parseLong() 也可能溢出(最大 9223372036854775807)。
- 如果业务上允许任意长度整数,用
new BigInteger(s)最稳妥,它不设上限 - 如果只是想快速拒绝超长输入,可在 parse 前检查字符串长度:
s.length() > 10(对 int)或s.length() > 19(对 long)就直接返回错误 - 注意前导零问题:
"00123"对parseInt()是合法的,结果是 123;但某些业务可能认为这是非法格式,需额外用正则^0$|^(-?[1-9]\\d*)$校验
parseInt() 完全不识别后者。真要支持多语言数字,得先做 Unicode 数字映射或交给 ICU 库处理——这已经超出基础转换范畴了。











