2016-03-31 3 views
1

Я уверен, что это что-то простое, что я просто не вижу, у меня есть цикл while, предлагающий пользователю размер массива, который будет использоваться для остальной части программы. Если пользователь вводит правильный вход, программа продолжается, и работает отлично, но если пользователь вводит неправильный ввод ...Цикл do-while не ждет ввода пользователем?

public static void main(String[] args) 
{ 
    // user enters up to 20 double values, stored in an array, user should enter 99999 to quit entering numbers. If user has not entered any numbers yet 
    // display an error message, otherwise, display each entered value and it's distance from the average 

    Scanner keyboard = new Scanner(System.in); 
    int arraySize = 0; 
    boolean isValid = false; 

    do 
    { 
    isValid = true; 
    arraySize = 0; // reset these values at start of each loop. 

    System.out.println("Enter an array size."); 
    try { 
     arraySize = keyboard.nextInt(); 
    } 
    catch(NegativeArraySizeException mistake) { 
     System.out.println("Do not enter a negative number for the arrays size."); 
     System.out.println(); 
     isValid = false; 
    } 
    catch(InputMismatchException mistake) { 
     System.out.println("Make sure to enter a valid number."); 
     System.out.println(); 
     isValid = false; 
    } 
    } while (isValid == false); 

Если пользователь вводит неверный ввод, например, «красный», блок улова пинает и печатает «Обязательно введите действительный номер». и «Введите размер массива». снова и снова, не давая пользователю возможность фактически вводить какие-либо данные. Я решил сбросить переменную arraySize, чтобы исправить это, но это не так. Я предполагаю, что в буфере клавиатуры есть вещи, но до сих пор не работало ни одна комбинация пустых printlns.

Я слышал, что Исключения не должны использоваться для проверки ввода пользователя. Почему это?

Независимо от того, что это не относится к этому вопросу, так как это упражнение в обработке исключений.

+0

mmuzahid почти нет. Я добавил способ проверить отрицательность входного значения. Пожалуйста, проверьте –

ответ

1

Вы можете добавить keyboard.nextLine(); в случае исключения, и он должен решить проблему.

try { 
    arraySize = keyboard.nextInt(); 
} 
catch(NegativeArraySizeException mistake) { 
    System.out.println("Do not enter a negative number for the arrays size."); 
    System.out.println(); 
    isValid = false; 
    keyboard.nextLine(); 
} 
catch(Exception mistake) { 
    System.out.println("Make sure to enter a valid number."); 
    System.out.println(); 
    isValid = false; 
    keyboard.nextLine(); 
    } 
+0

Это исправлено. Я просто подумал, что добавление дополнительных печатных линий не способ очистить буфер клавиатуры в конце концов, это добавление дополнительных nextLines. Лишение сна снова ударяет. –

2

Без использования переменной isValid boolean и введите простой код для ввода.

int arraySize = 0; 
do { 
    System.out.println("Enter a valid array size."); 
    try { 
     arraySize = Integer.valueOf(keyboard.nextLine()); 
     if (arraySize < 0) throw new NegativeArraySizeException();// for negative arry size 
     break;// loop break when got a valid input 
    } catch (Exception mistake) { 
     System.err.println("Invalid input: " + mistake); 
    } 
} while (true); 
+0

«Разрыв»; когда-либо вызывают какие-либо проблемы? Я знаю, что некоторые вещи, такие как «goto» и тому подобное, могут вызвать проблемы. Если это не так, это кажется очень изящным способом создания «бесконечных» циклов, и я буду принимать это как решение для решения этой проблемы. –

+1

@SpaceOstrich в Java нет '' goto'''. Я использовал инструкцию 'break'' для выхода цикла, когда получил заданное целое число, для которого задан размер массива. Может быть, я ошибаюсь, но вы можете уменьшить свой код таким образом, чтобы получить только действительный ввод. – mmuzahid

0

Посмотрите, подходит ли это исправление для вас. У сканера возникает проблема, когда вы пытаетесь получить строку из функции nextInt. В этом я принес строку и проанализирован в целое, а затем обрабатывается исключение формата Number

public static void main(String[] args) { 
    // user enters up to 20 double values, stored in an array, user should enter 99999 to quit entering numbers. If user has not entered any numbers yet 
    // display an error message, otherwise, display each entered value and it's distance from the average 

    Scanner keyboard = new Scanner(System.in); 
    int arraySize = 0; 
    boolean isValid = false; 

    do { 
     isValid = true; 
     arraySize = 0; // reset these values at start of each loop. 

     System.out.println("Enter an array size."); 
     try { 
      arraySize = Integer.parseInt(keyboard.next()); 
     } catch (NegativeArraySizeException mistake) { 
      System.out.println("Do not enter a negative number for the arrays size."); 
      System.out.println(); 
      isValid = false; 
     } catch (InputMismatchException mistake) { 
      System.out.println("Make sure to enter a valid number."); 
      System.out.println(); 
      isValid = false; 
     } catch (NumberFormatException nfe) { 
      System.out.println("Make sure to enter a valid number."); 
      System.out.println(); 
      isValid = false; 
     } 

    } while (isValid == false); 
} 
0

mmuzahid почти у всех. Но я добавил способ проверки отрицательного числа. Попробуйте

Scanner keyboard = new Scanner(System.in); 
    int arraySize = 0; 
    boolean isValid = false; 
    do { 
     System.out.println("Enter a valid array size."); 
     try { 
      arraySize = Integer.valueOf(keyboard.nextLine()); 

      if (arraySize < 0) { 
       System.out.println("Make sure to enter a valid positive number."); 
      } else { 
       break; 
      } 
     } catch (Exception mistake) { 
      System.out.println("Make sure to enter a valid number. Error:" + mistake); 
     } 
    } while (true); 
0

Использование keyboard.nextLine() и NumberFormatException

do { 
      // more code 
      try { 
       arraySize = Integer.valueOf((keyboard.nextLine())); 
      } catch (NegativeArraySizeException mistake) { 
       // more code 
       isValid = false; 
      } catch (InputMismatchException mistake) { 
       // more code 
       isValid = false; 
      } catch (NumberFormatException mistake) { 
       // more code 
       isValid = false; 
      } 
} while (isValid == false); 
+0

[В чем разница между методами next() и nextLine() из класса Scanner?] (Http://stackoverflow.com/questions/22458575/whats-the-difference-between-next-and-nextline-methods-from- сканер-класс) – Alice

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