核心方法
Long.parseLong(String s)
这是最常用、最直接的方法,它是一个静态方法,尝试将给定的 String 参数解析为 long 类型。

语法:
public static long parseLong(String s) throws NumberFormatException
特点:
- 抛出异常:
String不是有效的long格式(包含非数字字符、超出long范围等),它会抛出NumberFormatException,这是一种“失败快速”(fail-fast)的策略。 - 功能强大: 可以处理正负号( / ),但不能处理任何空格。
示例代码:
public class StringToLongExample {
public static void main(String[] args) {
String str1 = "123456789";
String str2 = "-987654321";
String str3 = "123abc"; // 无效格式
try {
long num1 = Long.parseLong(str1);
System.out.println("转换成功: " + str1 + " -> " + num1);
long num2 = Long.parseLong(str2);
System.out.println("转换成功: " + str2 + " -> " + num2);
// 这行代码会抛出异常
long num3 = Long.parseLong(str3);
System.out.println("转换成功: " + str3 + " -> " + num3);
} catch (NumberFormatException e) {
System.out.println("转换失败: '" + str3 + "' 不是有效的 long 格式。");
// e.printStackTrace(); // 打印详细的错误堆栈
}
}
}
输出:

转换成功: 123456789 -> 123456789
转换成功: -987654321 -> -987654321
转换失败: '123abc' 不是有效的 long 格式。
Long.valueOf(String s)
这个方法同样可以将 String 转换为 long,但它返回的是 Long 对象(long 的包装类),而不是原始的 long 类型。
语法:
public static Long valueOf(String s) throws NumberFormatException
特点:
- 返回对象: 返回
Long类型,如果你需要一个原始的long,需要再进行拆箱(unboxing)操作。 - 内部机制:
Long.valueOf(String)内部实际上是调用了Long.parseLong(String),它的行为和抛出的异常与parseLong完全一致。 - 性能: 在某些情况下,由于
Long会缓存一定范围内的值(-128到127),频繁调用valueOf可能会比parseLong再手动装箱更高效,但这通常不是主要考虑因素。
示例代码:

public class StringToLongValueOfExample {
public static void main(String[] args) {
String str = "255";
// 使用 valueOf,返回 Long 对象
Long longObj = Long.valueOf(str);
System.out.println("转换结果 (Long 对象): " + longObj);
System.out.println("对象类型: " + longObj.getClass().getName());
// 如果需要原始的 long 类型,进行拆箱
long primitiveLong = longObj; // 或者 long primitiveLong = longObj.longValue();
System.out.println("转换结果 (原始 long): " + primitiveLong);
System.out.println("原始类型: " + ((Object)primitiveLong).getClass().getName());
}
}
输出:
转换结果 (Long 对象): 255
对象类型: java.lang.Long
转换结果 (原始 long): 255
原始类型: long
如何选择?
| 特性 | Long.parseLong(String) |
Long.valueOf(String) |
|---|---|---|
| 返回类型 | 原始类型 long |
包装类 Long |
| 异常处理 | 抛出 NumberFormatException |
抛出 NumberFormatException |
| 使用场景 | 当你明确需要一个原始的 long 值时(用于数学计算、数组索引等)。 |
当你需要一个 Long 对象时(存入 List<Long> 或作为泛型参数)。 |
| 性能 | 直接返回原始值,性能稍好。 | 需要创建对象,但缓存机制对小整数有优化。 |
简单总结:
- 需要
long? 用Long.parseLong()。 - 需要
Long对象? 用Long.valueOf()。
重要注意事项和最佳实践
处理异常(try-catch)
这是最关键的一点,永远不要假设输入的 String 一定是有效的。必须使用 try-catch 块来处理可能发生的 NumberFormatException。
// 错误示范:不处理异常
String input = "not a number";
long number = Long.parseLong(input); // 程序会在这里崩溃
System.out.println(number);
// 正确示范:处理异常
try {
long number = Long.parseLong(input);
// ... 使用 number
} catch (NumberFormatException e) {
System.err.println("输入 '" + input + "' 无法转换为数字。");
// 可以设置一个默认值,或者提示用户重新输入
long number = 0L;
}
处理前导和尾随空格
Long.parseLong() 和 Long.valueOf() 不能处理字符串前后的空格,如果输入可能包含空格,你需要先用 String.trim() 方法去除。
String strWithSpaces = " 12345 "; // Long.parseLong(strWithSpaces); // 会抛出 NumberFormatException long number = Long.parseLong(strWithSpaces.trim()); System.out.println(number); // 输出: 12345
处理 null 值
如果传入的 String 是 null,这两个方法都会抛出 NullPointerException,在调用之前进行检查。
String nullableStr = null;
if (nullableStr != null) {
try {
long number = Long.parseLong(nullableStr.trim());
} catch (NumberFormatException e) {
// ...
}
} else {
System.out.println("输入字符串为 null,无法转换。");
}
数值范围检查
long 类型的范围是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,如果字符串表示的数字超出了这个范围,parseLong 会抛出 NumberFormatException。
String tooBig = "9223372036854775808"; // 比 Long.MAX_VALUE 还大 1
try {
Long.parseLong(tooBig);
} catch (NumberFormatException e) {
System.out.println("数字 '" + tooBig + "' 超出了 long 类型的范围。");
}
完整的最佳实践示例
这是一个健壮的转换函数,它处理了 null、空格和无效格式,并提供了默认值。
public class StringUtils {
/**
* 将字符串安全地转换为 long。
*
* @param str 要转换的字符串。
* @param defaultValue 如果转换失败时返回的默认值。
* @return 转换后的 long 值,如果转换失败则返回 defaultValue。
*/
public static long toLong(String str, long defaultValue) {
if (str == null || str.trim().isEmpty()) {
return defaultValue;
}
try {
return Long.parseLong(str.trim());
} catch (NumberFormatException e) {
// 可以选择记录日志
// log.warn("字符串 '{}' 无法转换为 long。", str, e);
return defaultValue;
}
}
public static void main(String[] args) {
System.out.println(toLong("123", -1)); // 输出: 123
System.out.println(toLong("-456", -1)); // 输出: -456
System.out.println(toLong(" 789 ", -1)); // 输出: 789 (处理了空格)
System.out.println(toLong("abc", -1)); // 输出: -1 (转换失败,返回默认值)
System.out.println(toLong("null", -1)); // 输出: -1 (转换失败,返回默认值)
System.out.println(toLong(null, -1)); // 输出: -1 (输入为 null,返回默认值)
System.out.println(toLong("", -1)); // 输出: -1 (输入为空,返回默认值)
}
}
| 方法 | 返回类型 | 是否抛出异常 | 处理空格 | 推荐场景 |
|---|---|---|---|---|
Long.parseLong() |
long |
NumberFormatException |
不处理 | 首选,当你需要原始的 long 值时。 |
Long.valueOf() |
Long |
NumberFormatException |
不处理 | 当你需要 Long 对象时。 |
记住核心要点:
- 优先使用
Long.parseLong()获取原始类型。 - 始终用
try-catch包裹 来处理NumberFormatException。 - 用
String.trim()清理输入字符串中的前后空格。 - 检查
null值,避免NullPointerException。
