Как я могу прочитать только строку, используя исключения?

не могли бы вы быть так любезны и помочь мне, пожалуйста? Я делаю простую викторину, во время игры пользователю предлагается ввести свой ответ. Это либо A, B, либо C. Я хотел бы, чтобы это было покрыто исключениями try/catch...

Что я хочу, чтобы этот код делал, так это генерировать исключение (заставлять пользователя снова вводить ответ) всякий раз, когда он вводит что-то еще, кроме строки. вот часть кода

Scanner sc = new Scanner(System.in);
String answer = "";
boolean invalidInput = true;

while(invalidInput){
    try {
        answer = sc.nextLine().toUpperCase();
        invalidInput = false;
    }
    catch(InputMismatchException e){
         System.out.println("Enter a letter please");
         invalidInput = true;
    }
}    

Теперь проблема в том, что если я введу целое число, оно ничего не выдаст.

Спасибо


person FussV    schedule 17.06.2015    source источник
comment
как насчет чтения символов вместо целых чисел и фильтрации кодов символов? что-то вроде этого. stackoverflow .com/questions/4945695/ или stackoverflow.com/questions/13012871/   -  person Nagarz    schedule 17.06.2015
comment
@Nagarz ваш комментарий должен быть ответом ;-)   -  person LionC    schedule 17.06.2015
comment
@LionC может быть, но это скорее идея, чем ответ, потому что это не совсем то, о чем он просил.   -  person Nagarz    schedule 17.06.2015
comment
получить использование регулярного выражения в вашем случае   -  person Hiren    schedule 17.06.2015
comment
Я бы сразу использовал операторы if, но задание было дано учителем, обрабатывать введенные значения исключениями... Я должен сделать это так, иначе учитель не примет это. но спасибо.   -  person FussV    schedule 17.06.2015


Ответы (3)


Просто введите InputMismatchException, если данные не соответствуют вашим ожиданиям.

Scanner sc = new Scanner(System.in);
String answer = "";
boolean invalidInput = true;    
while(invalidInput){
    try {
        answer = sc.nextLine().toUpperCase();
        if (!answer.equals("A") && !answer.equals("B") && !answer.equals("C")) {
            throw new InputMismatchException();
        } 
        invalidInput = false;
    } catch (InputMismatchException e) {
        System.out.println("Enter a letter please");
        invalidInput = true;
    }
}  

Обратите внимание, что для такого типа элементов управления нет необходимости создавать исключение. Вы можете обработать сообщение об ошибке непосредственно в коде if.

person Davide Lorenzo MARINO    schedule 17.06.2015
comment
Выбрасывание InputMismatchException при необходимости - person Davide Lorenzo MARINO; 17.06.2015
comment
Спасибо, это то, что я искал. Я хотел использовать операторы if с самого начала, но задача заключалась в использовании исключений... это их комбинация, и она работает плавно, как попка младенца. благодаря. - person FussV; 17.06.2015

Теперь проблема в том, что если я введу целое число, оно ничего не выдаст.

Нет, проблема в том, что вы думаете, что это целое число, а на самом деле это String.

String s=1; //Gives Compilation Error 

пока

 String s="1"; // will not give any Error/Exception and this is your case

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

List<String> expectedInputs=Arrays.asList("A","B","C","D");
String input=takeInputFromUser();
if(expectedInputs.contains(input)){
     //doWhatever you want to do 
}else{
     // throw any Exception
}
person Neeraj Jain    schedule 17.06.2015

Я рекомендую вам использовать regex в этом случае

try {
    answer = sc.nextLine().toUpperCase();
    invalidInput = !answer.matches("[ABC]");                
} catch(InputMismatchException e){
    System.out.println("Enter a letter please");
    invalidInput = true;
}
person ksap    schedule 17.06.2015
comment
Спасибо, заметил. Хотя учитель заставил меня использовать исключения. В следующий раз сделаю так. - person FussV; 17.06.2015