介绍
在这个实验中,你将学习如何判断一个给定的字符串能否在 Java 中成功转换为双精度浮点数。我们将探讨使用 Double.parseDouble() 方法尝试解析字符串的过程,了解如何处理当字符串不是有效的数字表示形式时可能出现的 NumberFormatException 错误,并讨论检查字符串是否符合有效十进制格式的方法。完成本实验后,你将掌握在 Java 应用程序中安全、有效地将字符串转换为双精度浮点数的知识。
使用 Double.parseDouble() 尝试解析
在这一步中,你将学习如何在 Java 中将数字的字符串表示形式转换为数值类型。当你从用户那里获取输入或从文件中读取数据时,这是一项常见的任务,因为输入通常最初是以文本(字符串)形式读取的。
Java 提供了多种方法来执行这种转换。将字符串转换为双精度浮点数最常用的方法之一是使用 Double.parseDouble() 方法。
让我们创建一个简单的 Java 程序来演示这一点。
如果
HelloJava.java文件尚未在 WebIDE 编辑器中打开,请打开它。将文件的全部内容替换为以下代码:
import java.util.Scanner; public class HelloJava { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a decimal number: "); String userInput = scanner.nextLine(); // Attempt to parse the input string into a double double number = Double.parseDouble(userInput); System.out.println("You entered: " + number); scanner.close(); } }让我们来看看这段代码的新部分:
System.out.print("Enter a decimal number: ");:这行代码提示用户输入一个十进制数。String userInput = scanner.nextLine();:这行代码将用户的输入作为字符串读取,并将其存储在userInput变量中。double number = Double.parseDouble(userInput);:这是这一步的核心。Double.parseDouble()方法接受userInput字符串,并尝试将其转换为double类型的值。如果该字符串可以成功解释为十进制数,则得到的double值将存储在number变量中。System.out.println("You entered: " + number);:这行代码将解析后的double值打印回给用户。
保存文件(Ctrl+S 或 Cmd+S)。
现在,编译修改后的程序。打开 WebIDE 底部的终端,并确保你位于
~/project目录中。然后运行以下命令:javac HelloJava.java如果编译成功,你将看不到任何输出。
最后,运行程序:
java HelloJava程序将提示你输入一个十进制数。输入一个有效的十进制数,例如
123.45,然后按回车键。Enter a decimal number: 123.45 You entered: 123.45程序应该能够成功解析你的输入并将数字打印回给你。
在这一步中,你已经成功使用 Double.parseDouble() 将有效的十进制数字符串表示形式转换为 double 类型。但是,如果用户输入的不是有效的数字,会发生什么呢?我们将在下一步中探讨这个问题。
处理 NumberFormatException
在上一步中,我们了解了当输入字符串是有效的十进制数时,Double.parseDouble() 是如何工作的。但如果用户输入的文本无法转换为数字,会发生什么呢?让我们来试试看。
确保你在终端中处于
~/project目录。再次运行程序:
java HelloJava当提示你输入一个十进制数时,输入明显不是数字的内容,比如
hello或abc。Enter a decimal number: hello按下回车键。你可能会在终端中看到很多红色文本。这是一条错误消息,具体来说是
NumberFormatException。Exception in thread "main" java.lang.NumberFormatException: For input string: "hello" at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2050) at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110) at java.base/java.lang.Double.parseDouble(Double.java:651) at HelloJava.main(HelloJava.java:10)之所以会出现这个
NumberFormatException,是因为字符串 "hello" 无法被解析为有效的double值。当发生这样的异常且没有被处理时,程序会崩溃并停止执行。在实际应用中,你不希望程序仅仅因为用户输入了无效内容就崩溃。你需要一种方法来优雅地处理这类错误。在 Java 中,我们使用
try-catch块来处理异常。try-catch块的工作原理如下:- 可能引发异常的代码放在
try块中。 - 如果
try块中发生异常,catch块中的代码将被执行。 - 如果没有发生异常,
catch块将被跳过。
- 可能引发异常的代码放在
让我们修改程序,使用 try-catch 块来处理 NumberFormatException。
在 WebIDE 编辑器中打开
HelloJava.java文件。修改代码,将
Double.parseDouble()调用包裹在try-catch块中:import java.util.Scanner; public class HelloJava { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a decimal number: "); String userInput = scanner.nextLine(); try { // Attempt to parse the input string into a double double number = Double.parseDouble(userInput); System.out.println("You entered: " + number); } catch (NumberFormatException e) { // This code runs if a NumberFormatException occurs System.out.println("Invalid input. Please enter a valid decimal number."); } scanner.close(); } }在这个更新后的代码中:
Double.parseDouble(userInput);这一行位于try块内。catch (NumberFormatException e)块指定,如果try块中发生NumberFormatException,则执行catch块中的代码。- 在
catch块中,我们打印了一条用户友好的错误消息,而不是让程序崩溃。
保存文件(Ctrl+S 或 Cmd+S)。
编译修改后的程序:
javac HelloJava.java再次运行程序:
java HelloJava当提示输入时,再次输入像
hello这样的无效输入。Enter a decimal number: hello Invalid input. Please enter a valid decimal number.这次,程序没有崩溃,而是捕获了
NumberFormatException并打印了catch块中的消息。这是一种更好的用户体验!
你现在已经学会了如何使用 try-catch 块来处理像 NumberFormatException 这样的异常,让你的程序更加健壮和用户友好。
检查是否为有效的十进制格式
在上一步中,我们使用 try-catch 块成功处理了 NumberFormatException。这避免了在输入不是有效数字时程序崩溃。然而,当前的方法仍然会尝试解析字符串,并且仅在解析失败 之后 才捕获错误。
一种更主动的方法是在尝试解析输入字符串之前,检查它是否具有有效的十进制格式。这可以通过正则表达式或其他验证技术来实现。在这个实验中,我们将在循环中进行简单的检查,不断要求用户输入,直到提供有效的十进制数为止。
这种方法将 try-catch 块与循环结合起来,以确保获得有效的输入。
在 WebIDE 编辑器中打开
HelloJava.java文件。修改代码,加入一个循环,持续运行直到接收到有效的输入:
import java.util.Scanner; public class HelloJava { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double number = 0.0; // Initialize with a default value boolean validInput = false; // Flag to track valid input while (!validInput) { System.out.print("Enter a decimal number: "); String userInput = scanner.nextLine(); try { // Attempt to parse the input string into a double number = Double.parseDouble(userInput); validInput = true; // Set flag to true if parsing is successful } catch (NumberFormatException e) { // This code runs if a NumberFormatException occurs System.out.println("Invalid input. Please enter a valid decimal number."); } } System.out.println("You entered a valid number: " + number); scanner.close(); } }让我们看看这些更改:
double number = 0.0;:我们在循环外部初始化number变量。boolean validInput = false;:我们引入一个布尔变量validInput来控制循环。它最初为false。while (!validInput):这创建了一个while循环,只要validInput为false就会继续运行。- 在
try块内部,如果Double.parseDouble()成功,我们将validInput设置为true。这将导致循环在当前迭代后终止。 - 如果发生
NumberFormatException,则执行catch块,validInput保持为false,循环将继续,再次提示用户输入。 - 循环结束后(即
validInput为true),我们打印一条消息,确认接收到了有效的输入。
保存文件(Ctrl+S 或 Cmd+S)。
编译修改后的程序:
javac HelloJava.java运行程序:
java HelloJava现在,先尝试输入无效的输入,然后输入一个有效的十进制数。
Enter a decimal number: abc Invalid input. Please enter a valid decimal number. Enter a decimal number: 1.2.3 Invalid input. Please enter a valid decimal number. Enter a decimal number: 789.01 You entered a valid number: 789.01程序将持续要求输入,直到你提供一个
Double.parseDouble()能够成功转换的字符串。
你现在已经实现了一个基本的输入验证循环,确保程序在继续执行之前从用户那里接收到有效的十进制数。这是许多应用程序中处理用户输入的基本模式。
总结
在这个实验中,我们学习了如何检查一个字符串在 Java 中是否可以转换为双精度浮点数(double)。我们首先尝试使用 Double.parseDouble() 方法将字符串解析为双精度浮点数。该方法是将数字的字符串表示形式转换为数值类型的常用方法,在处理用户输入或从文件中读取的数据时特别有用。我们实现了一个简单的 Java 程序,该程序提示用户输入,将输入读取为字符串,然后使用 Double.parseDouble() 将其转换为双精度浮点数,展示了字符串到双精度浮点数转换的基本过程。



