#java #exception #inputmismatchexception
#java #исключение #исключение inputmismatchexception
Вопрос:
Я только изучаю Java и борюсь с обработкой исключений. Я пытаюсь написать быструю программу, которая принимает некоторые входные данные и экспортирует их, преобразованные в разные единицы.
Я использую сканер для приема входных данных и пытаюсь защититься от исключения InputMisatchException, но, несмотря на то, что вокруг него установлен блок try-catch для обработки исключения, он все равно завершается. код приведен ниже. Надеюсь, вы сможете помочь! Заранее спасибо.
import java.util.InputMismatchException;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
//init variables
String name = "";
int age = -1;
int height_in_cm = -1;
//Init Scanner
Scanner input = new Scanner(System.in);
//Get the input from the user and save to the initiated variables above.
System.out.print("Please enter your name: ");
name = input.nextLine();
try{
System.out.printf("Hey, %s. How old are you?: ", name);
age = input.nextInt();
} catch (InputMismatchException e){
System.out.printf("Agh! Sorry %s. We were expecting a number made up of digits between 0-9. Try again for us? n How old are you?: ", name);
age = input.nextInt();
}
System.out.print("And finally, what is your height in CM?: ");
height_in_cm = input.nextInt();
//close the scanner to protect from resource leaks.
input.close();
}
}```
Ответ №1:
Причина исключения заключается в том, что при первом возникновении исключения сканер (ввод) не обновляет свой указатель, поэтому input.nextInt()
в блоке catch считывается тот же ввод, что и в input.nextInt()
блоке try .
Чтобы решить эту проблему, добавьте input.nextLine()
блок catch перед чтением значения int.
try{
System.out.printf("Hey, %s. How old are you?: ", name);
age = input.nextInt();
} catch (InputMismatchException e){
System.out.printf("Agh! Sorry %s. We were expecting a number made up of digits between 0-9. Try again for us? n How old are you?: ", name);
input.nextLine();
age = input.nextInt();
}
Ответ №2:
Вам нужна дополнительная попытка -поймать
height_in_cm = input.nextInt();
Иначе вы получите другое исключение!
Ответ №3:
Причина в том, что вы улавливаете ошибку в блоке catch. Попробуйте реализовать для него цикл. Также не забудьте очистить буфер с помощью input.next();
, иначе вы столкнетесь с бесконечным циклом
do
{
try
{
System.out.printf("Hey, %s. How old are you?: ", name);
age = input.nextInt();
stop = true;
}
catch (InputMismatchException e)
{
System.out.printf("Agh! Sorry %s. We were expecting a number made up of digits between 0-9. Try again for us? n How old are you?: ", name);
input.next(); // Clearing the buffer. This is important otherwise Infinite Loop will occur
}
} while( !stop );