- Проверка ввода в Java
- Сопутствующая статья — Java Input
- Проверка ввода с помощью java.util.Scanner
- ОТВЕТЫ
- Ответ 1
- Обзор методов Scanner.hasNextXXX
- Пример 1: Проверка положительных целых чисел
- Ссылки API
- Связанные вопросы
- Ссылки
- Пример 4. Использование двух Scanner сразу
- Резюме
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
Проверка ввода в Java
Проверка — это процесс проверки вводимых пользователем данных или значений из базы данных на соответствие определенным ограничениям. Проверка применяется для сокращения времени, затрачиваемого программой на выполнение фактической бизнес-логики, а затем на обнаружение проблем во вводимых пользователем данных. Этот процесс увеличивает производительность и, следовательно, приводит к дальнейшим сеансам отладки в случае сбоя.
В Java-коде мы принимаем пользовательский ввод с помощью класса Scanner . Существуют различные методы класса Scanner, которые помогают в проверке входящего содержимого.
Ниже приведен блок кода, объясняющий методы.
import java.util.Scanner; public class InputValidation public static void main(String[] args) Scanner scanner = new Scanner(System.in); System.out.println("Enter any text: "); while (!scanner.hasNext("quit")) System.out.println( scanner.hasNextInt() ? "The Input text is int: " + scanner.nextInt() : scanner.hasNextLong() ? "The Input text is long: " + scanner.nextLong() : scanner.hasNextDouble() ? "The Input text is double: " + scanner.nextDouble() : scanner.hasNextBoolean() ? "The Input text is boolean: " + scanner.nextBoolean() : "The Input text is String: " + scanner.next()); > > >
В приведенном выше блоке кода создается экземпляр класса Scanner . Вызов конструктора с использованием ключевого слова new принимает параметр входного потока, например System.in .
Теперь начинается реальная работа над экземпляром сканера. Во-первых, в условии while применяется проверка для определения условия завершения. В выражении используется метод hasNext класса Scanner. Метод принимает шаблон, соответствующий входному токену. И проверяет, есть ли на входе что-нибудь, кроме текста quit . Метод hasNext выдает исключение IllegalStateException при закрытии объекта сканера.
Теперь, когда блок запускается, ввод проверяется с помощью метода hasNextInt . Возвращает истину только в том случае, если введенный текст имеет значение int . Вводимый текст сканируется с консоли как int с помощью метода nextInt и печатается на консоли. Метод nextInt выдает InputMismatchException , когда текст не соответствует Integer Regex, IllegalStateException , когда экземпляр сканера закрывается.
Теперь весь этот блок проверки записан в виде вложенных троичных операторов. Если первое условие оценивается как ложное, применяется другая проверка. Метод hasNextDouble интерпретирует текст как двойной и возвращает true при совпадении. Метод nextDouble() возвращает двойное значение из стандартного вывода и выводит то же самое в консоль, в противном случае переходит для следующей проверки. Метод nextDouble() генерирует InputMismatchException , когда следующий токен из консоли не соответствует регулярному выражению с плавающей запятой, IllegalStateException при закрытии экземпляра сканера.
Еще одна проверка — с помощью метода hasNextBoolean . Этот метод проверяет логическое значение, истинное или ложное. Если возвращаемое значение — логическое True , используется nextBoolean() для получения консольного ввода и вывода его на экран вывода. В противном случае он переходит к разделу тернарных операторов else. Метод nextBoolean выдает InputMismatchException , когда следующий токен не обнаруживает логическое значение, IllegalStateException , когда экземпляр сканера закрывается.
Следуя той же схеме, ввод проверяется с помощью метода next . Метод становится последним условием раздела проверки ввода. Метод выполняет поиск и возвращает весь предшествующий текст с консоли. Функция может заблокировать вывод консоли в ожидании сканирования ввода. Метод всегда возвращает строковое значение. Оценка обрабатывает специальные символы также как строки и выводит их на печать. Вызывается то же исключение, что и другие методы. Скажите IllegalStateException , если сканер закрыт, или NoSuchElementException , если больше нет доступных токенов.
Ниже приведен выходной блок для вышеуказанного кода проверки.
Enter any text: -- The input text is String: -- 67 The input text is int: 67 1234567890000000 The input text is long: 1234567890000000 true The input text is boolean: true FALSE The input text is boolean: false 90.08939782639 The input text is double: 90.08939782639 hi The input text is String: hi quit
Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.
Сопутствующая статья — Java Input
Проверка ввода с помощью java.util.Scanner
Я беру ввод пользователя с System.in с помощью java.util.Scanner . Мне нужно проверить вход для таких вещей, как:
- Это должно быть неотрицательное число
- Это должно быть алфавитная буква
- . и т.д.
Какой лучший способ сделать это?
ОТВЕТЫ
Ответ 1
Обзор методов Scanner.hasNextXXX
java.util.Scanner имеет много методов hasNextXXX , которые могут использоваться для проверки ввода. Вот краткий обзор всех из них:
- hasNext() — у него есть любой токен вообще?
- hasNextLine() — есть ли еще одна строка ввода?
- Для Java-примитивов
- hasNextInt() — у него есть токен, который можно разобрать в int ?
- Также доступны hasNextDouble() , hasNextFloat() , hasNextByte() , hasNextShort() , hasNextLong() и hasNextBoolean()
- В качестве бонуса также есть hasNextBigInteger() и hasNextBigDecimal()
- Интегральные типы также имеют перегрузки для указания оснований (например, шестнадцатеричных)
- hasNext(String pattern)
- hasNext(Pattern pattern) — это Pattern.compile перегрузка
Scanner способен к большему, включенному тем, что он основан на регулярном выражении. Важной особенностью является useDelimiter(String pattern) , которая позволяет определить, какой шаблон разделяет ваши токены. Существуют также методы find и skip , которые игнорируют разделители.
Следующее обсуждение будет поддерживать регулярное выражение как можно более простым, поэтому фокус остается на Scanner .
Пример 1: Проверка положительных целых чисел
Вот простой пример использования hasNextInt() для проверки положительного int на входе.
Scanner sc = new Scanner(System.in); int number; do < System.out.println("Please enter a positive number!"); while (!sc.hasNextInt()) < System.out.println("That not a number!"); sc.next(); // this is important! >number = sc.nextInt(); > while (number
Введите положительное число!
пять
Это не число!
-3
Введите положительное число!
5
Спасибо! Получил 5Заметьте, насколько проще Scanner.hasNextInt() использовать по сравнению с более подробными try/catch Integer.parseInt / NumberFormatException комбо. По контракту a Scanner гарантирует, что если он hasNextInt() , то nextInt() мирно предоставит вам int и не будет бросать никаких NumberFormatException / InputMismatchException / NoSuchElementException .
Связанные вопросы
Пример 2: Несколько hasNextXXX на одном и том же токене
Обратите внимание, что вышеприведенный фрагмент содержит инструкцию sc.next() для продвижения Scanner до тех пор, пока не будет hasNextInt() . Важно понимать, что ни один из методов hasNextXXX не продвигает Scanner мимо любого ввода!. Вы обнаружите, что если вы опустите это line из фрагмента, затем он перейдет в бесконечный цикл на недопустимом вводе!
- Если вам нужно пропустить вход "мусор", который не прошел тест hasNextXXX , вам необходимо заранее продвинуть Scanner (например, next() , nextLine() , skip и т.д.)).
- Если один тест hasNextXXX завершился с ошибкой, вы все равно можете проверить, возможно ли это hasNextYYY !
Здесь приведен пример выполнения нескольких тестов hasNextXXX .
Scanner sc = new Scanner(System.in); while (!sc.hasNext("exit"))
5
(int) 5
ложь
(boolean) false
бла
(String) blah
1.1
(двойной) 1.1
100000000000
(длинный) 100000000000
выходОбратите внимание, что порядок испытаний имеет значение. Если a Scanner hasNextInt() , то это также hasNextLong() , но это не обязательно true наоборот. Чаще всего вы хотите сделать более конкретный тест перед более общим тестом.
Пример 3: Проверка гласных
Scanner имеет множество расширенных функций, поддерживаемых регулярными выражениями. Вот пример его использования для проверки гласных.
Scanner sc = new Scanner(System.in); System.out.println("Please enter a vowel, lowercase!"); while (!sc.hasNext("[aeiou]")) < System.out.println("That not a vowel!"); sc.next(); >String vowel = sc.next(); System.out.println("Thank you! Got " + vowel);
Введите гласный, в нижнем регистре!
5
Это не гласный!
г
Это не гласный!
е
Спасибо! Получил eВ regex, как строковый литерал Java, шаблон "[aeiou]" - это так называемый "класс символов"; он соответствует любой из букв a , e , i , o , u . Обратите внимание, что это тривиально, чтобы сделать вышеупомянутый тест нечувствительным к регистру: просто укажите такой шаблон регулярного выражения на Scanner .
Ссылки API
- hasNext(String pattern) - возвращает true , если следующий токен совпадает с шаблоном, построенным из указанной строки.
- java.util.regex.Pattern
Связанные вопросы
Ссылки
Пример 4. Использование двух Scanner сразу
Иногда вам нужно сканировать строки за строкой, с несколькими токенами на линии. Самый простой способ сделать это - использовать два Scanner , где второй Scanner принимает nextLine() из первого Scanner в качестве входного. Вот пример:
Scanner sc = new Scanner(System.in); System.out.println("Give me a bunch of numbers in a line (or 'exit')"); while (!sc.hasNext("exit")) < Scanner lineSc = new Scanner(sc.nextLine()); int sum = 0; while (lineSc.hasNextInt()) < sum += lineSc.nextInt(); >System.out.println("Sum is " + sum); >
Дайте мне кучу чисел в строке (или "exit" )
3 4 5
Сумма составляет 12
10 100 млн. ДолларовСумма составляет 110
ждать, что? Сумма 0
ВыходВ дополнение к Scanner(String) constructor, также Scanner(java.io.File) и др.
Резюме
- Scanner предоставляет богатый набор функций, таких как hasNextXXX методы для проверки.
- Правильное использование hasNextXXX/nextXXX в комбинации означает, что Scanner будет НИКОГДА не вывести InputMismatchException / NoSuchElementException .
- Всегда помните, что hasNextXXX не продвигает Scanner мимо любого ввода.
- Не стесняйтесь создавать несколько Scanner , если это необходимо. Два простых Scanner часто лучше, чем один сложный Scanner .
- Наконец, даже если у вас нет планов использовать расширенные функции регулярного выражения, имейте в виду, какие методы основаны на регулярных выражениях, а какие нет. Любой метод Scanner , который принимает аргумент String pattern , основан на регулярном выражении.
- Совет: простой способ превратить любой String в литеральный шаблон - Pattern.quote it.
Ответ 2
Для проверки строк для букв вы можете использовать регулярные выражения, например:
Для проверки номеров и остановки сбой программы, у меня есть довольно простой класс, который вы можете найти ниже, где вы можете определить диапазон значений, которые вы хотите. Здесь
public int readInt(String prompt, int min, int max) < Scanner scan = new Scanner(System.in); int number = 0; //Run once and loop until the input is within the specified range. do < //Print users message. System.out.printf("\n%s >", prompt); //Prevent string input crashing the program. while (!scan.hasNextInt()) < System.out.printf("Input doesn't match specifications. Try again."); System.out.printf("\n%s >", prompt); scan.next(); > //Set the number. number = scan.nextInt(); //If the number is outside range print an error message. if (number < min || number >max) System.out.printf("Input doesn't match specifications. Try again."); > while (number < min || number >max); return number; >
Ответ 3
Здесь минималистский способ сделать это.
System.out.print("Please enter an integer: "); while(!scan.hasNextInt()) scan.next(); int demoInt = scan.nextInt();
Ответ 4
try < int i = Integer.parseInt(myString); if (i < 0) < // Error, negative input >> catch (NumberFormatException e) < // Error, not a number. >
В commons-lang библиотека CharUtils класс, который предоставляет методы isAsciiNumeric() , чтобы проверить, что символ является числом, и isAsciiAlpha() , чтобы проверить, что символ является буквой.
Ответ 5
Если вы разбираете строковые данные с консоли или аналогичные, лучший способ - использовать регулярные выражения. Подробнее об этом читайте здесь: http://java.sun.com/developer/technicalArticles/releases/1.4regex/
В противном случае, чтобы проанализировать int из строки, попробуйте Integer.parseInt(строка). Если строка не является числом, вы получите исключение. Кроме того, вы можете выполнить свои проверки на это значение, чтобы убедиться, что оно не является отрицательным.
String input; int number; try < number = Integer.parseInt(input); if(number >0) < System.out.println("You positive number is " + number); >> catch (NumberFormatException ex)
Чтобы получить строку только для символов, вам, вероятно, будет лучше зацикливаться на каждом символе, проверяющем цифры, используя, например, Character.isLetter(char).
String input for(int i = 0; i >
Ответ 6
что я пробовал, так это то, что сначала я взял целочисленный ввод и проверил, является ли его отрицательным или нет, если его отрицательный снова принимает вход
Scanner s=new Scanner(System.in); int a=s.nextInt(); while(a <0) < System.out.println("please provide non negative integer input "); a=s.nextInt(); >System.out.println("the non negative integer input is "+a);
Здесь вам нужно сначала взять ввод символа и проверить, дал ли пользователь символ или нет, если нет, а затем снова введите символ
char ch = s.findInLine(".").charAt(0); while(!Charcter.isLetter(ch)) < System.out.println("please provide a character input "); ch=s.findInLine(".").charAt(0); >System.out.println("the character input is "+ch);