核心方法:Long.parseLong()
这是最常用、最直接的方法,它尝试将一个 String 参数解析为一个有符号的十进制 long。

基本用法
public class Main {
public static void main(String[] args) {
String strNumber = "12345";
// 使用 Long.parseLong() 进行转换
long number = Long.parseLong(strNumber);
System.out.println("转换后的 long 值是: " + number);
System.out.println("类型是: " + ((Object)number).getClass().getName()); // java.lang.Long
}
}
输出:
转换后的 long 值是: 12345
类型是: java.lang.Long
注意:Long.parseLong() 返回的是原始数据类型 long,而不是 Long 对象。
异常处理
Long.parseLong() 在遇到无法解析的字符串时会抛出 NumberFormatException,在实际开发中,你必须使用 try-catch 块来处理这种潜在的错误。
什么时候会抛出异常?

- 字符串为
null。 - 字符串不是有效的数字格式(包含字母、空格、特殊符号)。
- 字符串表示的数字超出了
long的范围(即< Long.MIN_VALUE或> Long.MAX_VALUE)。
示例:处理异常
public class Main {
public static void main(String[] args) {
String[] testCases = {
"12345", // 正常数字
"-9876", // 负数
"9223372036854775807", // Long.MAX_VALUE
"9223372036854775808", // 超出最大值
"-9223372036854775809", // 超出最小值
"123abc", // 包含非数字字符
" 123 ", // 包含前后空格
"123.45", // 包含小数点
null // null 值
};
for (String str : testCases) {
try {
long number = Long.parseLong(str);
System.out.println("成功: '" + str + "' -> " + number);
} catch (NumberFormatException e) {
System.out.println("失败: '" + str + "' -> 格式不正确或超出范围");
} catch (NullPointerException e) {
System.out.println("失败: '" + str + "' -> 字符串为 null");
}
}
}
}
输出:
成功: '12345' -> 12345
成功: '-9876' -> -9876
成功: '9223372036854775807' -> 9223372036854775807
失败: '9223372036854775808' -> 格式不正确或超出范围
失败: '-9223372036854775809' -> 格式不正确或超出范围
失败: '123abc' -> 格式不正确或超出范围
失败: ' 123 ' -> 格式不正确或超出范围
失败: '123.45' -> 格式不正确或超出范围
失败: 'null' -> 字符串为 null
从输出可以看出,Long.parseLong() 对前后空格非常敏感,会直接抛出异常。
其他方法
Long.valueOf()
这个方法也用于将 String 转换为 long,但它返回的是 Long 对象(即包装类型)。
- 行为:
Long.valueOf(str)内部也是调用Long.parseLong(str)来解析字符串,然后再将结果装箱成Long对象。 - 返回值:
Long对象。 - 异常:同样会抛出
NumberFormatException。
public class Main {
public static void main(String[] args) {
String strNumber = "12345";
// 使用 Long.valueOf() 进行转换
Long longObject = Long.valueOf(strNumber);
System.out.println("转换后的 Long 对象是: " + longObject);
System.out.println("类型是: " + longObject.getClass().getName()); // java.lang.Long
// 如果需要原始类型 long,可以再拆箱
long primitiveLong = longObject;
System.out.println("拆箱后的原始 long 值是: " + primitiveLong);
}
}
何时使用 valueOf vs parseLong?

- 当你需要一个
Long对象(存入List<Long>或作为泛型类型)时,使用Long.valueOf()。 - 当你需要原始数据类型
long进行计算时,使用Long.parseLong()更直接,避免了自动拆箱的开销(虽然现代 JVM 优化得很好,但意图更明确)。
处理带空格的字符串
正如上面示例所示,Long.parseLong() 无法直接处理前后有空格的字符串,如果需要这种灵活性,可以先用 String.trim() 方法去除空格。
public class Main {
public static void main(String[] args) {
String strWithSpaces = " 12345 ";
try {
// 先 trim 再解析
long number = Long.parseLong(strWithSpaces.trim());
System.out.println("成功转换: " + number); // 输出: 12345
} catch (NumberFormatException e) {
System.out.println("转换失败");
}
}
}
性能考虑
在性能敏感的场景下,Long.parseLong() 通常比 Long.valueOf() 略快,因为它直接返回原始类型,少了一步装箱操作,这种差异在现代 JVM 中通常可以忽略不计,代码的可读性和正确性比微小的性能差异更重要。
总结与最佳实践
| 方法 | 返回类型 | 是否抛出 NumberFormatException |
最佳使用场景 |
|---|---|---|---|
Long.parseLong(String s) |
long (原始类型) |
是 | 当你需要原始数据类型 long 进行数学运算或逻辑判断时。这是最常用的方法。 |
Long.valueOf(String s) |
Long (对象) |
是 | 当你需要一个 Long 对象时,例如用于集合、泛型或需要 null 值的场景。 |
new Long(String s) |
Long (对象) |
是 | 已过时 (Deprecated),不推荐使用,应使用 valueOf 代替,因为它可以利用缓存提高性能。 |
推荐的通用代码模板
当你需要从用户输入、配置文件或网络请求中获取一个 long 值时,使用以下模板是安全且健壮的:
public long parseLongSafely(String str) {
if (str == null || str.trim().isEmpty()) {
// 根据业务需求处理 null 或空字符串的情况
// 可以返回一个默认值,或者抛出一个自定义异常
throw new IllegalArgumentException("输入字符串不能为空或 null");
}
try {
return Long.parseLong(str.trim());
} catch (NumberFormatException e) {
// 记录错误日志,或者给用户一个友好的提示
System.err.println("无法将字符串 '" + str + "' 转换为 long: " + e.getMessage());
// 同样,可以返回默认值或抛出业务异常
throw new IllegalArgumentException("输入的 '" + str + "' 不是有效的数字格式", e);
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
String userInput = " 9876 ";
try {
long number = parseLongSafely(userInput);
System.out.println("转换成功: " + number);
} catch (IllegalArgumentException e) {
System.out.println("输入验证失败: " + e.getMessage());
}
}
}
核心要点:
- 首选
Long.parseLong():当你需要原始类型long时。 - 总是处理异常:使用
try-catch块来捕获NumberFormatException。 - 预处理输入:如果可能包含空格,先用
trim()处理。 - 检查
null:在使用字符串之前,检查它是否为null,以避免NullPointerException。
