杰瑞科技汇

Java的Number类如何转int?

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

Java的Number类如何转int?-图1
(图片来源网络,侵删)

核心方法:.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 异常。

Java的Number类如何转int?-图2
(图片来源网络,侵删)
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 等)

当你有一个 longdouble 类型的变量时,直接将其赋值给 int 变量即可,Java 会自动进行类型转换

A. longint

long 的值超出了 int 的范围时,会发生数据截断(高位数据被丢弃),而不是抛出异常,这通常是一个 bug 的来源,需要特别注意。

Java的Number类如何转int?-图3
(图片来源网络,侵删)
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 / floatint

当从浮点数(doublefloat)转换为 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;

核心要点回顾

  1. 首选 .intValue():当你已经有了 Number 的包装类对象时,这是最标准、最清晰的方法。
  2. String 转换用 parseInt:从 StringintInteger.parseInt() 是首选,要记得处理可能的 NumberFormatException
  3. 警惕精度丢失:从 longdouble 转换时,如果数值超出 int 的范围(-2^312^31-1),会发生无声的截断,导致数据错误,在转换前最好进行范围检查。
  4. 警惕小数截断:从 double/float 转换时,.intValue()(int) 强转会直接丢弃小数部分,如果需要四舍五入,请使用 Math.round()
  5. 防御 null:始终检查对象是否为 null,避免 NullPointerException
分享:
扫描分享到社交APP
上一篇
下一篇