2016-03-05 2 views
1

Я хочу проверить вход пользователя с помощью механизма обработки исключений.Как подтвердить ввод пользователя и снова ввести их ввод, если он недействителен, используя try-catch?

Например, предположим, что я прошу пользователя ввести целочисленный ввод и ввести символ. В этом случае я хотел бы сказать им, что они ввели неправильный ввод, и в дополнение к этому, я хочу, чтобы они предложили им прочитать в целое число снова и продолжать делать это до тех пор, пока они не введут приемлемый ввод.

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

Использование делать-то время, я хотел бы сделать что-то вроде этого:

Scanner reader = new Scanner(System.in); 
System.out.println("Please enter an integer: "); 
int i = 0; 
do { 
    i = reader.nextInt(); 
} while ( ((Object) i).getClass().getName() != Integer ) { 
    System.out.println("You did not enter an int. Please enter an integer: "); 
} 
System.out.println("Input of type int: " + i); 

ПРОБЛЕМЫ:

  1. InputMismatchException будет поднят на 5-й линии, перед проверкой заявления while состояние достигнут.

  2. Я действительно хочу научиться делать проверку ввода с использованием идиом обработки исключений.

Таким образом, когда пользователь вводит неправильный ввод, как я (1) сказать им, что их вклад является некорректным и (2) еще раз перечитал их ввода (и продолжать делать, что пока они не ввести правильный вход), используя механизм try-catch?


EDIT: @Italhouarne

import java.util.InputMismatchException; 
import java.util.Scanner; 


public class WhyThisInfiniteLoop { 

    public static void main (String [] args) { 
     Scanner reader = new Scanner(System.in); 
     int i = 0; 
     System.out.println("Please enter an integer: "); 

     while(true){ 
      try{ 
      i = reader.nextInt(); 
      break; 
      }catch(InputMismatchException ex){ 
      System.out.println("You did not enter an int. Please enter an integer:"); 
      } 
     } 

     System.out.println("Input of type int: " + i); 
    } 

} 

ответ

1

Здесь вы идете:

Scanner sc = new Scanner(System.in); 
boolean validInput = false; 
int value; 
do{ 
    System.out.println("Please enter an integer"); 
    try{ 
     value = Integer.parseInt(sc.nextLine()); 
     validInput = true; 
    }catch(IllegalArgumentException e){ 
     System.out.println("Invalid value"); 
    } 
}while(!validInput); 
1

Вы можете попробовать следующее:

Scanner reader = new Scanner(System.in); 
System.out.println("Please enter an integer: "); 
int i = 0; 

while(true){ 
    try{ 
    i = reader.nextInt(); 
    break; 
    }catch(InputMismatchException ex){ 
    System.out.println("You did not enter an int. Please enter an integer:"); 
    } 
} 

System.out.println("Input of type int: " + i); 
+0

Но 'в то время (правда)' бесконечный цикл – Solace

+1

@Solace Нет, потому что 'break' выйдет из него всякий раз, когда исключение не выдается (то есть вход является целое). – ltalhouarne

+0

Я тестировал ваш код, и он вводит бесконечный цикл, хотя и не там, где я (ошибочно) был expcted, но в блоке catch. Он продолжает печатать 'Вы не вводили int. Введите целое число: '. См. Редактирование в вопросе. Но почему это происходит не по себе. – Solace

1

В Java, то лучше использовать try/catch только для "exc эфективных "обстоятельств. Я бы использовал класс Scanner, чтобы определить, введен ли int или какой-либо другой недопустимый символ.

import java.util.Scanner; 

public class Test { 

    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     boolean gotInt = false; 

     while (!gotInt) { 
      System.out.print("Enter int: "); 
      if (scan.hasNextInt()){ 
       gotInt = true; 
      } 
      else { 
       scan.next(); //clear current input 
       System.out.println("Not an integer"); 
      } 
     } 
     int theInt = scan.nextInt(); 
    } 
} 
Смежные вопросы