核心方法概览
| 方法 | 来源 | 描述 | 优点 | 缺点 |
|---|---|---|---|---|
Integer.parseInt() |
java.lang.Integer |
最常用、最标准的方法,将字符串解析为 int 基本类型。 |
直接、高效,符合面向对象编程中“基本类型优先”的原则。 | 如果字符串格式不正确,会抛出 NumberFormatException。 |
Integer.valueOf() |
java.lang.Integer |
将字符串解析为 Integer 对象(包装类型)。 |
可以利用自动拆箱机制得到 int,代码可读性好。 |
会创建一个新的 Integer 对象(在 -128 到 127 范围外),性能略低于 parseInt。 |
NumberUtils.toInt() |
Apache Commons Lang | Apache Commons Lang 工具类提供的方法。 | 非常方便,提供了默认值,无需自己写 try-catch 逻辑。 |
需要引入第三方库 commons-lang3,不适合轻量级项目。 |
Integer.parseInt() (最推荐)
这是最标准、最常用的方法,它直接将字符串转换为 int 基本类型。

语法
public static int parseInt(String s) throws NumberFormatException;
代码示例
public class StringToIntExample {
public static void main(String[] args) {
String strNumber = "12345";
try {
// 使用 Integer.parseInt() 将字符串转换为 int
int number = Integer.parseInt(strNumber);
System.out.println("转换成功!整数是: " + number);
System.out.println("类型: " + ((Object)number).getClass().getName()); // 输出基本类型 int
// 另一个例子
String negativeStr = "-789";
int negativeNum = Integer.parseInt(negativeStr);
System.out.println("转换成功!负数是: " + negativeNum);
} catch (NumberFormatException e) {
// 如果字符串不是一个有效的整数表示,会抛出此异常
System.err.println("错误:字符串 '" + strNumber + "' 不是有效的整数。");
e.printStackTrace();
}
}
}
输出:
转换成功!整数是: 12345
类型: int
转换成功!负数是: -789
异常处理
如果字符串无法被解析为整数,Integer.parseInt() 会抛出 NumberFormatException,字符串包含非数字字符、为空或超出 int 范围。
String invalidStr1 = "123a"; // 包含字母
String invalidStr2 = ""; // 空字符串
String invalidStr3 = "999999999999999999999"; // 超出 int 范围
try {
Integer.parseInt(invalidStr1);
} catch (NumberFormatException e) {
System.out.println("捕获异常: " + e.getMessage()); // 输出: For input string: "123a"
}
Integer.valueOf()
这个方法将字符串解析为 Integer 对象(包装类型),在现代 Java(1.5+)中,由于自动拆箱机制,你可以直接将它用在需要 int 的地方,它会自动转换为基本类型。
语法
public static Integer valueOf(String s) throws NumberFormatException;
代码示例
public class StringToIntegerObjectExample {
public static void main(String[] args) {
String strNumber = "9876";
try {
// 使用 Integer.valueOf() 将字符串转换为 Integer 对象
Integer integerObject = Integer.valueOf(strNumber);
System.out.println("转换成功!Integer 对象是: " + integerObject);
System.out.println("类型: " + integerObject.getClass().getName()); // 输出 java.lang.Integer
// 自动拆箱:可以直接在需要 int 的地方使用
int number = integerObject; // 自动从 Integer 拆箱为 int
System.out.println("拆箱后的整数是: " + number);
System.out.println("类型: " + ((Object)number).getClass().getName()); // 输出 int
} catch (NumberFormatException e) {
System.err.println("错误:字符串不是有效的整数。");
e.printStackTrace();
}
}
}
输出:

转换成功!Integer 对象是: 9876
类型: java.lang.Integer
拆箱后的整数是: 9876
类型: int
parseInt vs valueOf 的选择
- 性能:
parseInt通常比valueOf稍快一点,因为它直接返回基本类型,而valueOf需要创建一个对象(尽管在 -128 到 127 范围内,JVM 会缓存对象,性能差异很小)。 - 使用场景:
- 如果你明确需要一个
int基本类型,优先使用parseInt,这更清晰,也更符合意图。 - 如果你需要一个
Integer对象(要存入一个List<Integer>),或者利用自动拆箱的便利性,可以使用valueOf。
- 如果你明确需要一个
NumberUtils.toInt() (第三方库)
如果你已经在项目中使用了 Apache Commons Lang 库,这个方法非常方便,因为它允许你提供一个默认值,当转换失败时不会抛出异常。
准备工作
需要在你的项目中添加 commons-lang3 依赖。
Maven (pom.xml):
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version> <!-- 使用最新版本 -->
</dependency>
Gradle (build.gradle):

implementation 'org.apache.commons:commons-lang3:3.12.0' // 使用最新版本
代码示例
import org.apache.commons.lang3.math.NumberUtils;
public class StringToIntWithDefaultExample {
public static void main(String[] args) {
String validStr = "555";
String invalidStr = "hello";
String nullStr = null;
// 转换成功,返回解析后的值
int num1 = NumberUtils.toInt(validStr);
System.out.println("转换成功: " + num1); // 输出 555
// 转换失败,返回默认值 0
int num2 = NumberUtils.toInt(invalidStr);
System.out.println("转换失败,使用默认值: " + num2); // 输出 0
// 字符串为 null,返回默认值 0
int num3 = NumberUtils.toInt(nullStr);
System.out.println("字符串为 null,使用默认值: " + num3); // 输出 0
// 提供自定义默认值
int num4 = NumberUtils.toInt(invalidStr, -1);
System.out.println("转换失败,使用自定义默认值: " + num4); // 输出 -1
}
}
总结与最佳实践
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 通用、标准场景 | Integer.parseInt() |
最直接、最符合 Java 习惯,性能好,是面试和日常开发的首选。 |
需要处理 null 或异常,且不想用 try-catch |
Integer.valueOf() + 自动拆箱 |
如果你能确定字符串格式正确,或者 try-catch 的逻辑更清晰,则此方法也可。 |
| 项目已引入 Apache Commons Lang | NumberUtils.toInt() |
非常简洁,提供了默认值,避免了样板代码的 try-catch 块,代码更健壮。 |
字符串可能为 null 或格式不确定 |
try-catch 包裹 Integer.parseInt() |
这是处理不确定输入最健壮的方式,可以精确地处理每种错误情况。 |
最终建议:
对于绝大多数情况,使用 Integer.parseInt() 并配合 try-catch 块是最佳实践,它能让你清晰地处理转换失败的情况,并且不依赖任何第三方库。
// 最佳实践示例
public static int convertToInt(String str) {
if (str == null || str.trim().isEmpty()) {
// 可以选择返回一个默认值,或者抛出自定义异常
return 0;
}
try {
return Integer.parseInt(str);
} catch (NumberFormatException e) {
// 记录日志或进行其他错误处理
System.err.println("无法将字符串 '" + str + "' 转换为整数。");
return 0; // 或者抛出一个更明确的业务异常
}
} 