Запрос ввода после перехвата исключения

Я хочу, чтобы пользователь ввел число, которое сканируется следующим кодом:

scanner.nextInt();

Если вместо этого пользователь вводит строку, программа выдает InputMismatchException, что очевидно. Я хочу поймать исключение таким образом, чтобы программа предлагала пользователю ввести ввод, пока пользователь не введет целочисленное значение.

Scanner scanner = new Scanner(System.in);
while(true) {
    try {
        System.out.println("Please enter a number: ");
        int input = scanner.nextInt();
        System.out.println(input);
        //statements
        break;
    }
    catch(InputMismatchException | NumberFormatException ex ) {
        continue;
    }
}

Этот код создает бесконечный цикл при вводе строки.


person h-rai    schedule 30.08.2012    source источник
comment
Возможно, вам придется сбросить Scanner (у меня нет реального опыта работы с классом, но я видел, как это делается в другом месте), попробуйте scanner.reset() перед continue   -  person MadProgrammer    schedule 30.08.2012
comment
Возможно, вы захотите взглянуть на ‹stackoverflow .com/questions/3059333/  -  person stealthjong    schedule 30.08.2012


Ответы (3)


Поместите Scanner scanner = new Scanner(System.in); в цикл while.

Scanner scanner;
while(true) {    
    try {
        System.out.println("Please enter a number: ");
        scanner = new Scanner(System.in);
        int input = scanner.nextInt();
        System.out.println(input);
        //statements
        break;
    }
    catch(InputMismatchException | NumberFormatException ex ) {
        System.out.println("I said a number...");
    }
}
person sp00m    schedule 30.08.2012
comment
то, что вы сказали, работает, но я определил объект сканера вне самого метода. Другими словами, это переменная класса. Есть ли способ сделать это без создания объекта в инструкции try-catch? - person h-rai; 30.08.2012
comment
Конечно, просто восстанавливайте один и тот же объект в каждом цикле. Смотрите редактирование. - person sp00m; 30.08.2012

Ответ на мою проблему следующий:

Scanner scanner = new Scanner(System.in);
while(true) {
    try {
        System.out.println("Please enter a number: ");
        int input = scanner.nextInt();
        System.out.println(input);
        //statements
        break;
    }
    catch(InputMismatchException | NumberFormatException ex ) {
        scanner.next();//new piece of code which parses the wrong input and clears the //scanner for new input
        continue;
    }
}
person h-rai    schedule 31.08.2012

Как насчет этого?

while(true) {    
    try {
        System.out.println("Please enter a number: ");
        Scanner scanner = new Scanner(System.in);
        int input = scanner.nextInt();
        System.out.println("\n\nEntered number is : " + input);
        break;
    } catch(InputMismatchException | NumberFormatException ex ) {
        System.out.println("\n\nInput was not a number. Please enter number again : ");
    } catch(Exception e ) {
        System.out.println("\n\nException caught :: " + e);
    }
}

Я также удалил синтаксис continue, поскольку он не нужен.

person Fahim Parkar    schedule 30.08.2012