杰瑞科技汇

Java String转Long有哪些方法?

核心方法

Long.parseLong(String s)

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

Java String转Long有哪些方法?-图1
(图片来源网络,侵删)

语法:

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(); // 打印详细的错误堆栈
        }
    }
}

输出:

Java String转Long有哪些方法?-图2
(图片来源网络,侵删)
转换成功: 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 会缓存一定范围内的值(-128127),频繁调用 valueOf 可能会比 parseLong 再手动装箱更高效,但这通常不是主要考虑因素。

示例代码:

Java String转Long有哪些方法?-图3
(图片来源网络,侵删)
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> 或作为泛型参数)。
性能 直接返回原始值,性能稍好。 需要创建对象,但缓存机制对小整数有优化。

简单总结:

  • 需要 longLong.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

如果传入的 Stringnull,这两个方法都会抛出 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,8089,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 对象时。

记住核心要点:

  1. 优先使用 Long.parseLong() 获取原始类型。
  2. 始终用 try-catch 包裹 来处理 NumberFormatException
  3. String.trim() 清理输入字符串中的前后空格。
  4. 检查 null,避免 NullPointerException
分享:
扫描分享到社交APP
上一篇
下一篇