Как я могу получить только целочисленный ввод с клавиатуры и если ввод недействителен, как я могу спросить пользователя снова? - PullRequest
1 голос
/ 11 апреля 2010

Это то, что я написал до сих пор, но когда возникает исключение, он больше не запрашивает ввод у пользователя.

    do {
        System.out.println("Enter the number of stones to play with: ");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        String temp = br.readLine();
        key = Integer.parseInt(temp);
    } while (key < 0 && key > 9);

    if (key < 0 || key > 10)
        throw new InvalidStartingStonesException(key);

    player1 = new KeyBoardPlayer();
    player2 = new KeyBoardPlayer(); 
    this.player1 = player1;
    this.player2 = player2;
    state = new KalaGameState(key);
} catch (NumberFormatException nFE) {
    System.out.println("Not an Integer");
} catch (IOException e) {
    System.out.println(e);
}

Ответы [ 5 ]

3 голосов
/ 11 апреля 2010

Как только выбрасывается NumberFormatException, вы выпрыгиваете из цикла и спускаетесь к catch. Если ваш try - catch блок внутри вашего while цикла, он будет иметь эффект, который вы ищете Возможно, вам придется настроить условие в цикле.

0 голосов
/ 11 апреля 2010

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

import java.util.Scanner;

открытый класс HelloWorld {

public static void main(String[] args){
    int n = getInteger("Enter integer: ");

    System.out.println(n);

}

public static boolean isInteger(String s){

    if(s.isEmpty())return false;
    for (int i = 0; i <s.length();++i){
        char c = s.charAt(i);
        if(!Character.isDigit(c) && c !='-')
            return false;
    }

    return true;
}

public static int getInteger(String prompt){
    Scanner input = new Scanner(System.in);
    String in = "";
    System.out.println(prompt);
    in = input.nextLine();
    while(!isInteger(in)){
        System.out.println(prompt);
        in = input.nextLine();
    }

    return Integer.parseInt(in);

}

}

0 голосов
/ 11 апреля 2010

См. Teleteype.readInt () из шаблона проекта Java . Основой этого является то, что вы читаете ввод в виде строки, а затем преобразуете его в целое число, используя Integer.parseInt () , который будет выбрасывать NumberFormatException , если содержимое строки не является целым числом, которое вы можете обработать, перехватив NumberFormatException.

0 голосов
/ 11 апреля 2010

Альтернативный способ - проверить, соответствует ли ввод строки регулярному выражению для целого числа. Если он не совпадает, вы снова запрашиваете ввод.

0 голосов
/ 11 апреля 2010
while (true) {
   System.out.println("Enter the number of stones to play with: ");
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
   key = Integer.parseInt(br.readLine());
   if (key > -1 && key < 10)
      break;
   else
      System.out.println("Invalid number of stones. Choose from 0 - 9");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...