最常用的是integer.parseint(),但需处理numberformatexception;它不接受null、空字符串或带空格的字符串,应先trim()并校验非空;支持负号但不支持"+-42";多进制需用三参数版本;valueof()返回缓存对象,慎用==比较。

直接用 Integer.parseInt() 最常用,但必须处理 NumberFormatException
绝大多数场景下,你只需要把字符串转成基本类型 int,Integer.parseInt() 是最直白的选择。它不接受 null,也不接受带空格或前导零的非法格式(比如 " 123" 或 "0123" 在 Java 8+ 默认不支持八进制解析),一旦出问题就抛 NumberFormatException。
常见错误现象:Exception in thread "main" java.lang.NumberFormatException: For input string: "abc" 或 "null" 或 ""。
- 空字符串
""、null、纯空白(如" ")都会炸,得先str != null && !str.trim().isEmpty() - 如果字符串可能含前后空格,务必先
trim(),否则" 42 "会失败 - 想支持带符号(
"-42")?没问题,parseInt原生支持;但"+-42"不行 - 十六进制或其它进制?得用三参数版本:
Integer.parseInt("FF", 16)
Integer.valueOf() 返回的是 Integer 对象,有缓存陷阱
它和 parseInt() 行为几乎一样,区别只在返回值:前者返回包装类 Integer,后者返回基本类型 int。但关键在于,valueOf() 对 -128 到 127 之间的值做了缓存——这意味着相同数值的两次调用可能返回同一个对象引用。
使用场景:需要传入泛型容器(如 List<integer></integer>)、或明确要对象而非基本类型时才用它;日常计算中没必要,还可能引发奇怪的 == 比较问题。
立即学习“Java免费学习笔记(深入)”;
- 别用
==比较两个Integer变量,除非确定都在缓存范围内;一律用.equals() -
Integer.valueOf("128") == Integer.valueOf("128")是false,而127就是true - 性能上,小范围数值用
valueOf()略快(复用对象),但差别微乎其微,别为此改逻辑
安全转换:自己封装一个不抛异常的工具方法
线上代码常遇到不可控输入(比如 HTTP 参数、配置文件读取),硬抛异常会导致流程中断。这时候你需要一个“尽力而为”的转换:给默认值,不崩溃。
不要依赖第三方库(如 Apache Commons 的 NumberUtils.toInt()),自己写几行更可控,也避免引入隐式依赖。
- 核心逻辑就是 try-catch
NumberFormatException,捕获后返回默认值(如0或-1) - 注意:默认值本身不能是业务有效值,否则无法区分“真转成功”和“转失败用了兜底”,比如用
-1当默认值,就得确保业务里-1永远不是合法 ID - 别省略
trim(),哪怕文档说“输入已清洗”,运行时总有意外
public static int parseIntSafe(String s, int defaultValue) {
if (s == null || s.trim().isEmpty()) return defaultValue;
try {
return Integer.parseInt(s.trim());
} catch (NumberFormatException e) {
return defaultValue;
}
}
为什么不用 new Integer(String)?它已被废弃
Java 9 起,new Integer(String) 构造器被标记为 @Deprecated,不仅因为效率低(每次都新建对象),更因为它绕过了 valueOf() 的缓存机制,还无法处理异常——出错直接崩,没机会兜底。
使用场景:基本没有。连单元测试里都不该出现。
- 所有 JDK 7+ 项目,请彻底忘掉这个构造器
- IDE(如 IntelliJ)会标黄警告;CI 流程里加
-Xlint:deprecation可拦截 - 如果看到遗留代码里有它,优先替换成
Integer.valueOf()或parseInt()
parseInt() 直接挂掉。宁可多两行 if,别赌输入干净。










