简介
在这个实验中,你将学习如何判断一个给定的字符串能否在 Java 中成功转换为双精度浮点数。我们将探讨使用 Double.parseDouble()
方法尝试解析字符串的过程,了解如何处理当字符串不是有效的数字表示形式时可能出现的 NumberFormatException
错误,并讨论检查字符串是否符合有效十进制格式的方法。完成本实验后,你将掌握在 Java 应用程序中安全、有效地将字符串转换为双精度浮点数的知识。
在这个实验中,你将学习如何判断一个给定的字符串能否在 Java 中成功转换为双精度浮点数。我们将探讨使用 Double.parseDouble()
方法尝试解析字符串的过程,了解如何处理当字符串不是有效的数字表示形式时可能出现的 NumberFormatException
错误,并讨论检查字符串是否符合有效十进制格式的方法。完成本实验后,你将掌握在 Java 应用程序中安全、有效地将字符串转换为双精度浮点数的知识。
在这一步中,你将学习如何在 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
类型。但是,如果用户输入的不是有效的数字,会发生什么呢?我们将在下一步中探讨这个问题。
在上一步中,我们了解了当输入字符串是有效的十进制数时,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()
将其转换为双精度浮点数,展示了字符串到双精度浮点数转换的基本过程。