Введение
В этом практическом занятии (лабораторной работе) вы научитесь определять, можно ли успешно преобразовать заданную строку в число с двойной точностью (double) в Java. Мы рассмотрим процесс попытки разбора строки с использованием метода Double.parseDouble(), узнаем, как обрабатывать потенциальные ошибки NumberFormatException, которые могут возникнуть, если строка не является допустимым числовым представлением, и обсудим методы проверки, соответствует ли строка допустимому десятичному формату. По завершении этого практического занятия вы получите знания, необходимые для безопасного и эффективного преобразования строк в числа с двойной точностью в своих Java-приложениях.
Попытка разбора с использованием Double.parseDouble()
На этом этапе мы научимся преобразовывать строковое представление числа в числовой тип в Java. Это распространенная задача, когда вы получаете ввод от пользователя или читаете данные из файла, так как ввод обычно первоначально считывается как текст (строки).
Java предоставляет несколько способов выполнить такое преобразование. Одним из наиболее распространенных методов для преобразования строки в число с двойной точностью (double) является использование метода 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.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Нажмите Enter. В Терминале, скорее всего, появится много красного текста. Это сообщение об ошибке, а именно
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.
Откройте файл
HelloJava.javaв редакторе WebIDE.Измените код, чтобы обернуть вызов
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, делая свои программы более надежными и дружественными к пользователю.
Проверка на корректный десятичный формат
На предыдущем этапе мы успешно обработали исключение NumberFormatException с помощью блока try-catch. Это предотвращает аварийное завершение нашей программы, когда ввод не является допустимым числом. Однако текущий подход по-прежнему пытается разобрать строку и перехватывает ошибку только после того, как разбор завершается неудачей.
Более активный подход - проверить, имеет ли входная строка допустимый десятичный формат перед попыткой ее разбора. Это можно сделать с помощью регулярных выражений или других методов валидации. В этом практическом занятии мы будем использовать простую проверку в цикле, чтобы неоднократно запрашивать у пользователя ввод до тех пор, пока не будет введено допустимое десятичное число.
Этот подход комбинирует блок try-catch с циклом, чтобы гарантировать получение допустимого ввода.
Откройте файл
HelloJava.javaв редакторе WebIDE.Измените код, добавив цикл, который будет продолжаться до тех пор, пока не будет получен допустимый ввод:
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()сможет успешно преобразовать.
Теперь вы реализовали базовый цикл валидации ввода, который гарантирует, что ваша программа получит от пользователя допустимое десятичное число перед продолжением выполнения. Это фундаментальный шаблон для обработки пользовательского ввода во многих приложениях.
Резюме
В этом практическом занятии мы научились проверять, можно ли преобразовать строку в число типа double в Java. Мы начали с попытки разбора строки в число типа double с помощью метода Double.parseDouble(). Этот метод является распространенным способом преобразования строковых представлений чисел в числовые типы, особенно полезным при обработке пользовательского ввода или данных, прочитанных из файлов. Мы реализовали простую Java-программу, которая запрашивает у пользователя ввод, считывает его как строку, а затем использует Double.parseDouble() для преобразования в число типа double, демонстрируя базовый процесс преобразования строки в число типа double.



