杰瑞科技汇

Java字符串转double,如何正确转换与异常处理?

下面我将详细介绍这三种方法,并提供代码示例和最佳实践。

Java字符串转double,如何正确转换与异常处理?-图1
(图片来源网络,侵删)

使用 Double.parseDouble(String s) - 推荐

这是最直接、最常用且性能最好的方法,它会尝试将字符串参数解析为 double 类型。

语法

public static double parseDouble(String s) throws NumberFormatException;

特点

  • 静态方法:通过 Double 类直接调用,无需创建 Double 对象。
  • 返回值:返回一个 double 基本数据类型。
  • 异常处理:如果字符串不能被解析为有效的 double(为 null、格式不正确、包含非数字字符等),它会抛出 NumberFormatException 异常。

代码示例

public class StringToDoubleExample {
    public static void main(String[] args) {
        // 1. 标准的数字字符串
        String str1 = "123.456";
        double d1 = Double.parseDouble(str1);
        System.out.println("转换结果 1: " + d1); // 输出: 转换结果 1: 123.456
        // 2. 包含科学计数法的字符串
        String str2 = "1.23e4";
        double d2 = Double.parseDouble(str2);
        System.out.println("转换结果 2: " + d2); // 输出: 转换结果 2: 12300.0
        // 3. 字符串前后有空格(会被自动忽略)
        String str3 = "  -78.90  ";
        double d3 = Double.parseDouble(str3);
        System.out.println("转换结果 3: " + d3); // 输出: 转换结果 3: -78.9
        // 4. 整数字符串(可以转换)
        String str4 = "100";
        double d4 = Double.parseDouble(str4);
        System.out.println("转换结果 4: " + d4); // 输出: 转换结果 4: 100.0
    }
}

异常处理示例

在实际开发中,你必须处理可能出现的 NumberFormatException

public class StringToDoubleWithErrorHandling {
    public static void main(String[] args) {
        String[] testStrings = {
            "123.45",
            "abc",
            null,
            "123.45.67",
            "  12.3  ",
            "1,000.50" // 千位分隔符,在Java中默认不被识别
        };
        for (String str : testStrings) {
            try {
                if (str == null) {
                    System.out.println("输入字符串为 null,无法转换。");
                    continue;
                }
                double value = Double.parseDouble(str);
                System.out.printf("'%s' -> %f%n", str, value);
            } catch (NumberFormatException e) {
                System.out.printf("错误:无法将字符串 '%s' 转换为 double。%n", str);
            }
        }
    }
}

输出:

'123.45' -> 123.450000
错误:无法将字符串 'abc' 转换为 double。
输入字符串为 null,无法转换。
错误:无法将字符串 '123.45.67' 转换为 double。
'  12.3  ' -> 12.300000
错误:无法将字符串 '1,000.50' 转换为 double。

使用 Double.valueOf(String s)

这个方法和方法一非常相似,但它返回的是一个 Double 对象(即 double 的包装类型)。

Java字符串转double,如何正确转换与异常处理?-图2
(图片来源网络,侵删)

语法

public static Double valueOf(String s) throws NumberFormatException;

特点

  • 静态方法:通过 Double 类直接调用。
  • 返回值:返回一个 Double 对象(包装类型)。
  • 异常处理:同样会在转换失败时抛出 NumberFormatException

代码示例

public class StringToDoubleValueOfExample {
    public static void main(String[] args) {
        String str = "987.65";
        // valueOf 返回的是 Double 对象
        Double doubleObj = Double.valueOf(str);
        // 可以直接使用对象,也可以通过 .doubleValue() 获取基本类型
        System.out.println("Double 对象: " + doubleObj);
        System.out.println("基本 double 值: " + doubleObj.doubleValue());
        // 自动拆箱 (Unboxing) 示例
        double d = Double.valueOf(str); // Java 会自动将 Double 对象拆箱为 double
        System.out.println("自动拆箱后的值: " + d);
    }
}

使用 Double 构造函数

你也可以通过 Double 类的构造函数来创建一个 Double 对象。

语法

public Double(String s) throws NumberFormatException;

特点

  • 构造函数:需要创建 Double 类的实例。
  • 返回值:返回一个 Double 对象(包装类型)。
  • 异常处理:转换失败时抛出 NumberFormatException

代码示例

public class StringToDoubleConstructorExample {
    public static void main(String[] args) {
        String str = "555.55";
        // 使用构造函数创建 Double 对象
        Double doubleObj = new Double(str);
        System.out.println("通过构造函数创建的 Double 对象: " + doubleObj);
        System.out.println("基本 double 值: " + doubleObj.doubleValue());
    }
}

方法对比与最佳实践

特性 Double.parseDouble() Double.valueOf() new Double()
返回类型 double (基本类型) Double (对象) Double (对象)
性能 最高,直接转换,无对象创建开销 较高,但会创建对象 较高,会创建对象
主要用途 当你只需要 double 值进行计算时 当你需要 Double 对象(例如存入集合)时 不推荐,valueOf() 是更好的选择
是否过时 在 Java 9 中被标记为过时,因为不必要地创建了对象
  1. 首选 Double.parseDouble()

    • 当你的目标是获取一个 double 基本数据类型用于后续的数学运算或逻辑判断时,这是最佳选择,因为它避免了不必要的对象创建,效率最高。
  2. 使用 Double.valueOf()

    • 当你需要一个 Double 对象时,要将转换后的值存入一个 List<Double>Map<String, Double> 等泛型集合中。
    • 在现代 Java 中,valueOf() 通常比构造函数更受青睐,并且它内部有缓存机制(对 -128127 之间的整数),可以复用对象。
  3. 避免使用 new Double()

    Java字符串转double,如何正确转换与异常处理?-图3
    (图片来源网络,侵删)
    • 由于在 Java 9 中已被标记为过时,valueOf() 能以更简洁的方式完成相同的工作,因此应该避免使用构造函数来创建 Double 对象。
  4. 始终进行异常处理

    • 永远不要假设输入的字符串一定是有效的,始终将转换逻辑包裹在 try-catch (NumberFormatException e) 块中,以增强程序的健壮性。

特殊情况处理

处理千位分隔符 (如 "1,000.50")

Double.parseDouble() 不能 直接处理包含逗号()作为千位分隔符的字符串,你需要先将其移除。

String strWithComma = "1,000,500.75";
// 错误的做法,会抛出 NumberFormatException
// double d = Double.parseDouble(strWithComma);
// 正确的做法:先移除所有非数字、非小数点、非负号、非科学计数法字符
String cleanStr = strWithComma.replaceAll("[^0-9.eE-]", "");
double d = Double.parseDouble(cleanStr);
System.out.println("移除逗号后转换: " + d); // 输出: 移除逗号后转换: 1000500.75

处理 null

直接对 null 字符串调用 parseDouble() 会立即抛出 NullPointerException,最好在调用前进行判断。

String str = null;
if (str != null) {
    try {
        double d = Double.parseDouble(str);
        System.out.println(d);
    } catch (NumberFormatException e) {
        System.out.println("格式错误");
    }
} else {
    System.out.println("输入字符串为 null");
}
分享:
扫描分享到社交APP
上一篇
下一篇