2013-10-02 7 views
0

Я работаю над проектом (игрой), и одно из требований - иметь предупреждения, если они вводят параметр вне диапазона (1-8), и если они вводят символ. Если пользователь вводит недопустимый номер, появляется меню и снова запрашивает, какой вариант они хотели бы. Если они вводят символ, программа должна попросить их ввести целое число и снова запросить ввод. Это то, что у меня есть до сих пор. Он правильно идентифицирует номер за пределами диапазона и напоминает меню. Он также идентифицирует символ (недопустимый ввод), но открывает ввод для пользователя, чтобы ввести правильный вариант. Как проверить оба условия?Проверка, является ли вход пользователя в диапазоне и является целым (Java)

Спасибо, Тайлер

  int userChoice = scnr.nextInt();//<-- use this variable 
      if (userChoice.hasNextInt() == false) 
      { 
       System.out.println("Error: Menu selection must be an integer! Please try again:"); 
      } 
      // Variable used for storing what the user's main menu choice 
      if (0 > userChoice || userChoice > 8) 
      { 
       System.out.println("Error: Invalid Menu Selection."); 
       System.out.println(""); 
       System.out.println("Available Actions:"); 
       System.out.println("(1) Print Market Prices"); 
       System.out.println("(2) Print Detailed Statistics"); 
       System.out.println("(3) Buy Some Sheep"); 
       System.out.println("(4) Buy a Guard Dog"); 
       System.out.println("(5) Sell a Sheep"); 
       System.out.println("(6) Sell a Guard Dog"); 
       System.out.println("(7) Enter Night Phase"); 
       System.out.println("(8) Quit"); 
       System.out.println("What would you like to do?"); 
       userChoice = scnr.nextInt(); 
      } 
+1

Вы проверки 'hasNExtInt()' после того, как вы получили 'int'. –

+0

Где я должен это проверить? –

ответ

0

вы используете hasNextInt() метод на примитивном int, чтобы увидеть, если вход interger. вместо того, чтобы использовать эту функцию:

int userChoice ; 
     try{ 
     userChoice =scnr.nextInt();//<-- use this variable 
     } 
     catch(InputMismatchException ime){ 
      System.out.println("Error: Menu selection must be an integer! Please try again:"); 
     } 

также использовать ту же логику внутри, если условия также

+0

Я не думаю, что могу использовать эти методы, поскольку это вводный проект. Нет ли более простого решения? –

+0

Я не использовал никаких дополнительных методов. У вас был hasNextInt() на примитиве, который не позволял компилировать код. У меня есть блок catch try. Если вы чувствуете, что это огромное для вводного proj, вы можете использовать userChoice = scnr.nextInt(); без окружения try, catch block. но будьте предупреждены о том, что вы столкнетесь с исключениями во время выполнения, если вход не является целым числом –

0

Лучше идти с защитой от включения саза в цикле. Java JDK 1.7 также поддерживает «строку» в окне коммутатора.

0
try{ 
    int userChoice = scnr.nextInt(); 
    if(userChoice > 0 && userChoice <9){ 
     // your logic 
    }else{ 
     System.out.println("Invalid choice"); 
     showMenu(); 
    } 

}catch(Exception e){ 
    System.out.println("Invalid choice"); 
    showMenu(); 
} 

public void showMenu(){ 
    System.out.println("Available Actions:"); 
    System.out.println("(1) Print Market Prices"); 
    System.out.println("(2) Print Detailed Statistics"); 
    System.out.println("(3) Buy Some Sheep"); 
    System.out.println("(4) Buy a Guard Dog"); 
    System.out.println("(5) Sell a Sheep"); 
    System.out.println("(6) Sell a Guard Dog"); 
    System.out.println("(7) Enter Night Phase"); 
    System.out.println("(8) Quit"); 
    System.out.println("What would you like to do?"); 
} 
0

Прежде всего, это исправление будет сделано на последовательности nextInt() и hasNextInt() вызывается. Первый используется для чтения значения из ввода, а второй используется для определения того, является ли тип значения int. Поэтому вы должны вызывать hasNext[Type](), а затем `next [Type].

Во-вторых, поскольку nextInt() возвращается в int, поэтому некорректно ссылаться hasNextInt() на переменную userChoice.

Давайте исправим эти два первых, как показано ниже.

if (scnr.hasNextInt()) { 
    int userChoice = scnr.nextInt(); 
} else { 
    // input is not an int 
} 

Теперь давайте исправить код, чтобы получить действительный int, а также распечатать инструкцию и попросить вход снова для недействительных входов.

Scanner scnr = new Scanner(System.in); 

boolean incorrectInput = true; 
int userChoice = -1; 

while (incorrectInput) { 

    if (scnr.hasNextInt()) { 

     userChoice = scnr.nextInt(); 
     // Variable used for storing what the user's main menu choice 

     if (0 >= userChoice || userChoice > 8) { 
      System.out.println("Error: Invalid Menu Selection."); 
      System.out.println(""); 
      System.out.println("Available Actions:"); 
      System.out.println("(1) Print Market Prices"); 
      System.out.println("(2) Print Detailed Statistics"); 
      System.out.println("(3) Buy Some Sheep"); 
      System.out.println("(4) Buy a Guard Dog"); 
      System.out.println("(5) Sell a Sheep"); 
      System.out.println("(6) Sell a Guard Dog"); 
      System.out.println("(7) Enter Night Phase"); 
      System.out.println("(8) Quit"); 
      System.out.println("What would you like to do?"); 

     } else { 
      incorrectInput = false; 
     } 
    } else { 
     scnr.next(); 
     System.out.println("Error: Menu selection must be an integer! Please try again:"); 
    } 
} 
System.out.println("userChoice = " + userChoice); 
0

Или, вы можете использовать мощный IntegerValidator из Apache Commons Validator:

if (new IntegerValidator().isInRange(Integer value, int min, int max)) { 
    // value is in range ... 
} 
Смежные вопросы