核心方法概览
| 方法 | 所属类 | 描述 | 优点 | 缺点 |
|---|---|---|---|---|
Long.parseLong(String s) |
java.lang.Long |
最常用,将字符串解析为 long 基本类型。 |
简单直接,性能最好。 | 如果字符串格式无效,会抛出 NumberFormatException。 |
Long.valueOf(String s) |
java.lang.Long |
将字符串解析为 Long 对象(包装类型)。 |
返回 Long 对象,方便在需要对象的地方使用。 |
性能略低于 parseLong,因为涉及对象创建,同样会抛出异常。 |
Long.parseLong(String s, int radix) |
java.lang.Long |
将字符串按指定进制解析为 long。 |
功能强大,支持二、八、十、十六进制等转换。 | 参数稍复杂,同样会抛出异常。 |
Long.parseLong(String s) - 推荐使用
这是最常用、最直接的方法,专门用于将 String 转换为 long 原始类型。

(图片来源网络,侵删)
语法
public static long parseLong(String s) throws NumberFormatException;
示例代码
public class StringToLongExample {
public static void main(String[] args) {
String strNumber = "123456789";
// 1. 成功转换
try {
long number = Long.parseLong(strNumber);
System.out.println("转换成功: " + number);
System.out.println("类型: " + ((Object)number).getClass().getName()); // 查看类型
} catch (NumberFormatException e) {
System.out.println("转换失败: 字符串格式不正确");
}
// 2. 字符串包含非数字字符
String invalidStr = "123abc";
try {
long invalidNumber = Long.parseLong(invalidStr);
System.out.println("这行不会被执行");
} catch (NumberFormatException e) {
System.out.println("\n捕获到异常: 字符串 '" + invalidStr + "' 不是有效的数字格式。");
}
// 3. 字符串表示的数字超出 long 范围
String outOfRangeStr = "9223372036854775808"; // Long.MAX_VALUE 是 9223372036854775807
try {
long outOfRangeNumber = Long.parseLong(outOfRangeStr);
System.out.println("这行不会被执行");
} catch (NumberFormatException e) {
System.out.println("\n捕获到异常: 字符串 '" + outOfRangeStr + "' 超出 long 类型的范围。");
}
}
}
输出
转换成功: 123456789
类型: long
捕获到异常: 字符串 '123abc' 不是有效的数字格式。
捕获到异常: 字符串 '9223372036854775808' 超出 long 类型的范围。
Long.valueOf(String s) - 返回包装类型
这个方法将字符串转换为一个 Long 对象(long 的包装类),当你需要一个 Long 对象而不是 long 基本类型时(在泛型集合 List<Long> 中),这个方法很有用。
语法
public static Long valueOf(String s) throws NumberFormatException;
示例代码
public class StringToLongObjectExample {
public static void main(String[] args) {
String strNumber = "987654321";
try {
// Long.valueOf() 返回的是一个 Long 对象
Long longObject = Long.valueOf(strNumber);
System.out.println("转换成功: " + longObject);
System.out.println("类型: " + longObject.getClass().getName()); // 查看类型
// 可以轻松地将其转换为 long 原始类型
long primitiveLong = longObject; // 自动拆箱
System.out.println("转换为基本类型 long: " + primitiveLong);
System.out.println("类型: " + ((Object)primitiveLong).getClass().getName());
} catch (NumberFormatException e) {
System.out.println("转换失败: 字符串格式不正确");
}
}
}
输出
转换成功: 987654321
类型: java.lang.Long
转换为基本类型 long: 987654321
类型: long
Long.parseLong(String s, int radix) - 进制转换
这是一个非常强大的方法,允许你按照指定的进制(基数)来解析字符串。
语法
public static long parseLong(String s, int radix) throws NumberFormatException;
s: 要解析的字符串。radix: 进制,范围必须在Character.MIN_RADIX(2) 到Character.MAX_RADIX(36) 之间。
示例代码
public class StringToLongRadixExample {
public static void main(String[] args) {
// 十进制 (默认)
String decimalStr = "255";
System.out.println("十进制 '" + decimalStr + "' 转换为 long: " + Long.parseLong(decimalStr, 10));
// 二进制
String binaryStr = "11111111"; // 255 的二进制表示
System.out.println("二进制 '" + binaryStr + "' 转换为 long: " + Long.parseLong(binaryStr, 2));
// 八进制
String octalStr = "377"; // 255 的八进制表示
System.out.println("八进制 '" + octalStr + "' 转换为 long: " + Long.parseLong(octalStr, 8));
// 十六进制
String hexStr = "FF"; // 255 的十六进制表示
System.out.println("十六进制 '" + hexStr + "' 转换为 long: " + Long.parseLong(hexStr, 16));
// 注意:十六进制字符串可以不带 "0x" 前缀
}
}
输出
十进制 '255' 转换为 long: 255
二进制 '11111111' 转换为 long: 255
八进制 '377' 转换为 long: 255
十六进制 'FF' 转换为 long: 255
异常处理与最佳实践
Long.parseLong() 和 Long.valueOf() 在遇到无效输入时都会抛出 NumberFormatException,这是一个非受检异常(Unchecked Exception),所以你必须处理它,否则程序可能会崩溃。
最佳实践:总是使用 try-catch 块
public static long convertToLong(String str) {
// 1. 先检查字符串是否为 null 或空
if (str == null || str.trim().isEmpty()) {
// 根据业务需求决定如何处理,可以返回默认值或抛出自定义异常
throw new IllegalArgumentException("输入字符串不能为 null 或空。");
}
try {
// 2. 尝试转换
return Long.parseLong(str);
} catch (NumberFormatException e) {
// 3. 捕获异常并处理
// 可以记录日志、返回默认值或抛出更具描述性的异常
System.err.println("错误: 无法将字符串 '" + str + "' 转换为 long 类型。");
// 返回一个默认值,0L
return 0L;
// 或者重新抛出一个运行时异常
// throw new RuntimeException("数字格式转换失败", e);
}
}
public static void main(String[] args) {
System.out.println("转换 '123': " + convertToLong("123"));
System.out.println("转换 'abc': " + convertToLong("abc"));
System.out.println("转换 'null': " + convertToLong(null)); // 会抛出 IllegalArgumentException
}
总结与如何选择
| 场景 | 推荐方法 | 理由 |
|---|---|---|
需要 long 原始类型,字符串格式为标准十进制。 |
Long.parseLong(String s) |
首选,性能最好,代码最简洁。 |
需要 Long 对象(例如用于泛型、集合或可为 null 的场景)。 |
Long.valueOf(String s) |
直接返回对象,无需额外装箱操作。 |
| 字符串是二进制、八进制、十六进制等非十进制格式。 | Long.parseLong(String s, int radix) |
唯一能处理进制转换的方法。 |
| 字符串可能包含前缀(如 "0x") | Long.decode(String nm) |
这个方法很特别,它能自动识别 "0x" (十六进制), "0" (八进制), "#" (十六进制) 前缀。 |
核心建议:

(图片来源网络,侵删)
- 99% 的情况下,使用
Long.parseLong(String s)。 - 如果需要处理进制,使用
Long.parseLong(String s, int radix)。 - 如果输入可能无效,务必用
try-catch包裹转换逻辑。 - 如果字符串可能是
null或空,务必先进行检查。

(图片来源网络,侵删)
