杰瑞科技汇

Java字符串如何转Long?

核心方法:Long.parseLong()

这是最常用、最直接的方法,它尝试将一个 String 参数解析为一个有符号的十进制 long

Java字符串如何转Long?-图1
(图片来源网络,侵删)

基本用法

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 块来处理这种潜在的错误。

什么时候会抛出异常?

Java字符串如何转Long?-图2
(图片来源网络,侵删)
  • 字符串为 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

Java字符串如何转Long?-图3
(图片来源网络,侵删)
  • 当你需要一个 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());
        }
    }
}

核心要点:

  1. 首选 Long.parseLong():当你需要原始类型 long 时。
  2. 总是处理异常:使用 try-catch 块来捕获 NumberFormatException
  3. 预处理输入:如果可能包含空格,先用 trim() 处理。
  4. 检查 null:在使用字符串之前,检查它是否为 null,以避免 NullPointerException
分享:
扫描分享到社交APP
上一篇
下一篇