2010-04-11 5 views
1

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

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); 
} 
+3

код действительно не делает этого. Вы задали аналогичный вопрос с другой учетной записью до: http://stackoverflow.com/questions/2614930/i-am-getting-exception-in-main-thread-even-when-i-am-handling-the-exception Зарегистрируйте свою учетную запись и придерживайтесь одной и той же учетной записи: http://www.google.com/search?q=InvalidStartingStonesException+site%3Astackoverflow.com – BalusC

+1

Тег как домашнее задание? – Anonymoose

ответ

3

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

-1
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"); 
} 
+0

Не обрабатывает 'NumberFormatException' - а также, это (я подозреваю) проблему с домашней задачей, давайте, возможно, предпочли бы хорошие намеки на явное изложение решения. – Etaoin

0

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

0

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

0

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

импорт 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); 

} 

}

Смежные вопросы