Я пытаюсь сделать небольшую программу более устойчивой, и я нуждаюсь в некоторой помощи с этим.
Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;
System.out.print("Enter number 1: ");
num1 = kb.nextInt();
while(num2 < num1) {
System.out.print("Enter number 2: ");
num2 = kb.nextInt();
}
Номер 2 должен быть больше, чем номер 1
Также я хочу, чтобы программа автоматически проверила и проигнорировала, если пользователь вводит символ вместо числа. Поскольку прямо сейчас, когда пользователь входит, например, r
вместо числа просто выходит программа.
Используйте Scanner.hasNextInt ()
:
Возвращает
истину
, если следующий токен на входе этого сканера можно интерпретировать как значениеint
в системе счисления по умолчанию с помощью методаnextInt ()
. Сканер не проходит мимо любого ввода.
Вот отрывок для иллюстрации:
Scanner sc = new Scanner(System.in);
System.out.print("Enter number 1: ");
while (!sc.hasNextInt()) sc.next();
int num1 = sc.nextInt();
int num2;
System.out.print("Enter number 2: ");
do {
while (!sc.hasNextInt()) sc.next();
num2 = sc.nextInt();
} while (num2 < num1);
System.out.println(num1 + " " + num2);
Вам не нужно parseInt
или беспокоиться о NumberFormatException
. Обратите внимание: поскольку методы hasNextXXX
не продвигаются дальше любого ввода, вам может потребоваться вызвать next ()
, если вы хотите пропустить «мусор», как показано выше.
Попробуйте следующее:
public static void main(String[] args)
{
Pattern p = Pattern.compile("^\\d+$");
Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;
String temp;
Matcher numberMatcher;
System.out.print("Enter number 1: ");
try
{
num1 = kb.nextInt();
}
catch (java.util.InputMismatchException e)
{
System.out.println("Invalid Input");
//
return;
}
while(num2<num1)
{
System.out.print("Enter number 2: ");
temp = kb.next();
numberMatcher = p.matcher(temp);
if (numberMatcher.matches())
{
num2 = Integer.parseInt(temp);
}
else
{
System.out.println("Invalid Number");
}
}
}
Вы также можете попытаться преобразовать строку в int
, но обычно люди стараются избегать генерации исключений.
Что я сделал, так это то, что я определил регулярное выражение, которое определяет число, \ d
означает числовую цифру. Знак +
означает, что должна быть одна или несколько цифр. Дополнительный \
перед \ d
вызван тем, что в java \
является специальным символом, поэтому его нужно экранировать.
Что вы можете сделать, так это также принять следующий токен как String, преобразовать эту строку в массив char и проверить, что каждый символ в массиве является цифрой.
Я думаю, что это правильно, если вы не хотите иметь дело с исключениями.
Я вижу, что Character.isDigit отлично подходит для этой цели, поскольку на входе будет только один символ. Конечно, у нас нет никакой информации об этом объекте kb, но на всякий случай, если это экземпляр java.util.Scanner, я бы также предложил использовать java.io.InputStreamReader для ввода командной строки. Вот пример:
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
try {
reader.read();
}
catch(Exception e) {
e.printStackTrace();
}
reader.close();
Это должно сработать:
import java.util.Scanner;
public class Test {
public static void main(String... args) throws Throwable {
Scanner kb = new Scanner(System.in);
int num1;
System.out.print("Enter number 1: ");
while (true)
try {
num1 = Integer.parseInt(kb.nextLine());
break;
} catch (NumberFormatException nfe) {
System.out.print("Try again: ");
}
int num2;
do {
System.out.print("Enter number 2: ");
while (true)
try {
num2 = Integer.parseInt(kb.nextLine());
break;
} catch (NumberFormatException nfe) {
System.out.print("Try again: ");
}
} while (num2 < num1);
}
}
String
, а затем попробуйте
ing Integer.parseInt ()
, и если вы не поймаете
исключение, тогда это число, если вы это сделаете, прочтите новый один, возможно, установив num2 в Integer.MIN_VALUE и используя тот же тип логики в вашем примере.