下面我将从最简单的情况开始,逐步讲解不同场景下的转换方法,并重点指出需要注意的异常和精度丢失问题。

核心方法:.intValue()
所有 Number 的子类(Integer, Long, Double 等)都继承了一个核心方法:intValue(),这个方法的作用就是将包装对象中的数值转换为 int 类型。
这是最直接、最推荐的方式。
示例1:从包装类转换
// 1. 从 Integer 转换 (最简单) Integer integerObj = 123; int intFromInteger = integerObj.intValue(); // 结果是 123 System.out.println(intFromInteger); // 2. 从 Long 转换 Long longObj = 9876543210L; int intFromLong = longObj.intValue(); // 结果是 1410065405 (注意精度问题,见下文) System.out.println(intFromLong); // 3. 从 Double 转换 Double doubleObj = 99.99; int intFromDouble = doubleObj.intValue(); // 结果是 99 (直接截断小数部分,见下文) System.out.println(intFromDouble);
场景1:从 String 转换 int
这是非常常见的需求,比如从用户输入或配置文件中读取数字。
方法A:Integer.parseInt() (推荐)
这是将 String 转换为基本类型 int 的标准方法,如果字符串不是一个有效的整数表示,它会抛出 NumberFormatException 异常。

String str1 = "1234";
int num1 = Integer.parseInt(str1); // 成功转换
System.out.println(num1); // 输出: 1234
String str2 = "-567";
int num2 = Integer.parseInt(str2); // 成功转换,支持负号
System.out.println(num2); // 输出: -567
String str3 = "12.34"; // 包含小数点,会抛出异常
try {
int num3 = Integer.parseInt(str3);
} catch (NumberFormatException e) {
System.out.println("错误: '" + str3 + "' 不是有效的整数格式");
}
String str4 = "abc"; // 非数字,会抛出异常
try {
int num4 = Integer.parseInt(str4);
} catch (NumberFormatException e) {
System.out.println("错误: '" + str4 + "' 不是有效的整数格式");
}
方法B:Integer.valueOf() (先转包装类)
Integer.valueOf() 会先将 String 转换为 Integer 对象,然后你可以再调用 .intValue() 得到 int 值,它也会在格式无效时抛出 NumberFormatException。
String str = "789"; // 先得到 Integer 对象,再得到 int 值 int num = Integer.valueOf(str).intValue(); System.out.println(num); // 输出: 789
对比:
Integer.parseInt()直接返回int基本类型,效率稍高,如果你不需要Integer对象,请用这个。Integer.valueOf()返回Integer对象,如果只需要int,多了一步调用,但 Java 5+ 后,valueOf会利用缓存(-128 到 127 之间),在某些情况下可以节省内存。
场景2:从其他基本类型转换 (long, double 等)
当你有一个 long 或 double 类型的变量时,直接将其赋值给 int 变量即可,Java 会自动进行类型转换。
A. long 转 int
当 long 的值超出了 int 的范围时,会发生数据截断(高位数据被丢弃),而不是抛出异常,这通常是一个 bug 的来源,需要特别注意。

long largeLong = 123456789L; int smallInt = (int) largeLong; // 强制转换,largeLong 在 int 范围内,是安全的 System.out.println(smallInt); // 输出: 123456789 // 超出 int 范围的例子 long tooBigForInt = 2147483648L; // int 的最大值是 2147483647 int truncatedInt = (int) tooBigForInt; System.out.println(truncatedInt); // 输出: -2147483648 (高位被截断,结果错误)
B. double / float 转 int
当从浮点数(double 或 float)转换为 int 时,会发生直接截断,即小数部分被直接丢弃,而不是四舍五入。
double myDouble = 99.8; double myDouble2 = 99.2; int intFromDouble1 = (int) myDouble; // 结果是 99 int intFromDouble2 = (int) myDouble2; // 结果也是 99 System.out.println(intFromDouble1); // 输出: 99 System.out.println(intFromDouble2); // 输出: 99 // 如果需要进行四舍五入,应该使用 Math.round() long roundedLong = Math.round(myDouble); // Math.round() 返回 long int roundedInt = (int) roundedLong; // 再转回 int System.out.println(roundedInt); // 输出: 100
场景3:处理 null 值
如果你尝试对一个 null 对象调用 .intValue(),程序会抛出 NullPointerException。
Integer nullInteger = null;
try {
int value = nullInteger.intValue(); // 抛出 NullPointerException
} catch (NullPointerException e) {
System.out.println("错误: 对象为 null,无法调用 intValue()");
}
最佳实践: 在调用 .intValue() 或任何方法之前,务必检查对象是否为 null。
Integer nullableInteger = null; int result = (nullableInteger != null) ? nullableInteger.intValue() : 0; // 提供一个默认值 0 System.out.println(result);
总结与最佳实践
| 源类型 | 转换方法 | 注意事项 | 示例 |
|---|---|---|---|
Integer 对象 |
.intValue() |
最直接,无异常风险 | int i = myInteger.intValue(); |
Long 对象 |
.intValue() |
注意精度:Long 值超出 int 范围,会截断 |
int i = myLong.intValue(); |
Double 对象 |
.intValue() |
注意截断:直接丢弃小数部分,不四舍五入 | int i = myDouble.intValue(); |
String |
Integer.parseInt() |
注意异常:如果字符串格式无效,抛出 NumberFormatException |
int i = Integer.parseInt("123"); |
long 基本类型 |
(int) |
注意精度:如果值超出范围,会截断,无异常 | int i = (int) myLongValue; |
double 基本类型 |
(int) |
注意截断:直接丢弃小数部分,如需四舍五入用 Math.round() |
int i = (int) myDoubleValue; |
null 对象 |
N/A | 必须检查:否则抛出 NullPointerException |
int i = (myObj != null) ? myObj.intValue() : 0; |
核心要点回顾
- 首选
.intValue():当你已经有了Number的包装类对象时,这是最标准、最清晰的方法。 String转换用parseInt:从String到int,Integer.parseInt()是首选,要记得处理可能的NumberFormatException。- 警惕精度丢失:从
long或double转换时,如果数值超出int的范围(-2^31到2^31-1),会发生无声的截断,导致数据错误,在转换前最好进行范围检查。 - 警惕小数截断:从
double/float转换时,.intValue()或(int)强转会直接丢弃小数部分,如果需要四舍五入,请使用Math.round()。 - 防御
null:始终检查对象是否为null,避免NullPointerException。
