У меня есть метод, который написал. Этот метод просто сканирует введенный пользователем целочисленный ввод. Если пользователь вводит значение символа, он выдает исключение несоответствия ввода, которое обрабатывается в моей инструкции Try-Catch. Проблема состоит в том, что если пользователь вводит что-либо, что не является числом, а затем генерируется исключение, мне нужен метод для обратной связи, чтобы снова запросить пользователя. Насколько я понимаю, оператор Try catch автоматически возвращается к блоку Try, если обнаружена ошибка. Это неправильно? Пожалуйста, порекомендуйте.
Вот мой метод (это довольно просто):
public static int getMask() {
//Prompt user to enter integer mask
Scanner keyboard = new Scanner(System.in);
int output = 0;
try{
System.out.print("Enter the encryption mask: ");
output = keyboard.nextInt();
}
catch(Exception e){
System.out.println("Please enter a number, mask must be numeric");
}
return output;
}//end of getMask method
Вот как метод реализован в моей программе:
//get integer mask from user input
int mask = getMask();
System.out.println("TEMP mask Value is: " + mask);
/***********************************/Вот мой обновленный код. Он создает цикл ввода, который я не могу избежать. Я не понимаю, почему я так много борюсь с этим. Пожалуйста помоги.
public static int getMask() {
//Prompt user to enter integer mask
Scanner keyboard = new Scanner(System.in);
int output = 0;
boolean validInput = true;
do{
try {
System.out.print("Enter the encryption mask: ");
output = keyboard.nextInt();
validInput = true;
}
catch(InputMismatchException e){
System.out.println("Please enter a number, mask must be numeric");
validInput = false;
}
}while(!(validInput));
return output;
/********************/FINAL_ANSWER Я смог получить его наконец. Я думаю, мне просто нужно больше изучать логическую логику. Иногда это заставляет мою голову вращаться. Реализация цикла с целым тестом отлично работала. Моя собственная ошибка пользователя. Вот мой последний код, который работает корректно с лучшей обработкой исключений. Дайте мне знать в комментариях, если у вас есть какие-либо критические замечания.
//get integer mask from user input
int repeat = 1;
int mask = 0;
do{
try{
mask = getMask();
repeat = 1;
}
catch(InputMismatchException e){
repeat = 0;
}
}while(repeat==0);
Насколько я понимаю, оператор Try catch автоматически возвращается к блоку Try, если обнаружена ошибка. Это неправильно?
Это действительно неверно. Блок try
будет выполняться только один раз.
Вы можете использовать это, чтобы "обойти" его (хотя ответ JasonC более прочный - идите с этим):
boolean validInput = false;
while (!validInput) {
try {
System.out.print("Enter the encryption mask: ");
output = keyboard.nextInt();
validInput = true;
}
catch(Exception e) {
keyboard.nextLine(); // swallow token!
System.out.println("Please enter a number, mask must be numeric");
}
}
return output;
Дальнейшее примечание: вы НЕ должны ловить Exception
но более конкретный класс исключений.
Насколько я понимаю, оператор Try catch автоматически возвращается к блоку Try, если обнаружена ошибка. Это неправильно?
Нет, это неправильно, и мне любопытно, как вы пришли к такому пониманию.
У вас есть несколько вариантов. Например (это не будет работать как есть, но сначала поговорим об обработке ошибок, а затем прочитайте ниже):
// Code for illustrative purposes but see comments on nextInt() below; this
// is not a working example as-is.
int output = 0;
while (true) {
try{
System.out.print("Enter the encryption mask: ");
output = keyboard.nextInt();
break;
}
catch(Exception e){
System.out.println("Please enter a number, mask must be numeric");
}
}
Среди прочих; ваш выбор варианта обычно зависит от ваших предпочтительных вкусов (например, fge-ответ - это та же идея, но немного отличается), но в большинстве случаев это прямое отражение того, что вы пытаетесь сделать: "Продолжайте спрашивать, пока пользователь вводит действительный номер. "
Обратите внимание, что, как и в случае с fge, вы должны, как правило, следить за самым строгим исключением, которое вы готовы обработать. nextInt()
выбрасывает несколько разных исключений, но ваш интерес определен специально в InputMismatchException
. Вы не готовы обрабатывать, например, IllegalStateException
- не говоря уже о том, что это затруднит отладку/тестирование, если будут IllegalStateException
неожиданные исключения, но ваша программа делает вид, что они просто связаны с недопустимым вводом (и поэтому никогда не уведомляет вас о том, что другая проблема произошло).
Теперь, Scanner.nextInt()
, Scanner.nextInt()
имеет другую проблему здесь, где токен остается в потоке, если он не может быть проанализирован как целое. Это оставит вас застрявшим в цикле, если вы не возьмете этот токен из потока. Для этого вы действительно хотите использовать либо next()
либо nextLine()
, чтобы токен всегда потреблялся независимо от того, что; то вы можете анализировать с помощью Integer.parseInt()
, например:
int output = 0;
while (true) {
try{
System.out.print("Enter the encryption mask: ");
String response = keyboard.next(); // or nextLine(), depending on requirements
output = Integer.parseInt(response);
break;
}
catch(NumberFormatException e){ // <- note specific exception type
System.out.println("Please enter a number, mask must be numeric");
}
}
Обратите внимание, что это по-прежнему прямо отражает то, что вы хотите сделать: "Продолжайте спрашивать, пока пользователь вводит действительный номер, но потребляйте входные данные независимо от того, что они вводят".
Как указано в комментариях, try-catch -blocks не работает. Используйте for
или while
если хотите цикл.
nextInt()
оставит токен в потоке при сбое.