2017-02-08 4 views
1

Мне интересно, как я могу остановить сканер от чтения лишнего ошибочного ввода от пользователя.Предотвращение сканера от чтения остаточного ввода в Java

Например, я хотел бы прочитать в поле ввода 2 one как 2 в переменную diam, которую выполняет программа ниже.

Проблема заключается в том, что следующий цикл автоматически обнаруживаетслева от входа и соответственно выполняет инструкцию if.

Мне удалось обойти это, создав два сканера, но, к сожалению, это недопустимо для данного задания. Кроме того, в нашей программе мы должны использовать .hasNextInt().

Как предотвратить этот «перелив», используя только один сканер? Я должен предположить, что этот вопрос был поставлен раньше, но мне не повезло найти ответ.

Scanner scnr = new Scanner(System.in); 

    System.out.print("Enter the diameter of a " 
      + "cylinder (in centimeters): "); 
    // BEGIN: diameter input verification loop  
    for (;;) { 
     if (!scnr.hasNextInt()) { 
      System.out.print("Please enter an integer value " 
        + "(less than 2,147,483,648) as decimal digits: "); 
      scnr.nextLine(); 
      continue; 
     } 
     diam = scnr.nextInt(); 
     if (diam >= 0) { 
      //null statement 
     } 
     else { 
      System.out.print("Please enter a positive integer value: "); 
      continue; 
     } 
    break; 
    } 
    //END: diameter input verification loop 

    //prompts user for container height  
    System.out.print("Enter the height of a " 
      + "cylinder (in centimeters): "); 

    // BEGIN: height input verification loop   
    for (;;) { 
     if (!scnr.hasNextInt()) { 
      System.out.print("Please enter an integer value " 
        + "(less than 2,147,483,648) as decimal digits: "); 
      scnr.nextLine(); 
      continue; 
     } 
     height = scnr.nextInt(); 
     if (height >= 0) { 
      //null statement 
     } 
     else { 
      System.out.print("Please enter a positive integer value: "); 
      continue; 
     } 
    break; 
    } 
    //END: height input verification loop` 

ответ

1

Я могу придумать несколько подходов:

  • Как отмечает Тим, вы можете использовать readLine() прочитать полную строку из пользователь, затем проанализируйте строку. Вы можете использовать split или создать новый сканер для разбора строки или различных других подходов.

  • Вы можете использовать один Scanner и звонить по номеру nextLine(), чтобы отбросить неиспользованные символы до следующего конца строки. Очевидно, что вам нужно сделать это после, вызывая nextInt(). Например:..

    height = -1; 
    while (height < 0) { 
        if (!scnr.hasNextInt()) { 
         System.out.print("Please enter an integer value " 
           + "(less than 2,147,483,648) as decimal digits: "); 
        } else { 
         height = scnr.nextInt(); 
         if (height < 0) { 
          System.out.print("Please enter a positive integer value: "); 
         } 
        } 
        scanner.nextLine(); 
    } 
    

    (выше версия кода перестроила вещи, чтобы избавиться от break и continue Перестройки также позволяет мне поставить ReadLine как безусловное последнее утверждение для цикла я думаю, что это делает логика легче понять ...)

2

Одним из вариантов было бы просто прочитать всю строку ввода от Scanner, а затем сохранить только первое слово. Например, для диаметра цилиндра вы можете использовать:

System.out.print("Enter the diameter of a cylinder (in centimeters): "); 
String input = scnr.nextLine(); 
try { 
    int diam = Integer.parseInt(input.split(" ")[0]); 
} 
catch (NumberFormatException e) { 
    System.out.print("Please enter an integer value " 
       + "(less than 2,147,483,648) as decimal digits: "); 
} 
+0

Благодарим вас за помощь, это похоже на простой способ сделать это. Хотя я забыл упомянуть, что назначение требует использования «.hasNextInt», и я считаю, что мы хотим придерживаться основных циклов, которые мы узнали до сих пор. Хотя, я не знаю, будет ли программа оценки отмечать ошибочность «try» и «catch». Мои извинения, я отредактирую свой вопрос. – FofX

+0

@FofX Если вы используете 'nextInt()', вы по определению читаете только один токен. Ваша проблема заключается в том, что вы хотите обработать сценарий, в который пользователь ввел в качестве входных токенов _multiple_. –

1
// BEGIN: height input verification loop 
     for (;;) { 

      scnr.nextLine(); /* read fresh input, deleting the left over input */ 

      if (!scnr.hasNextInt()) { 
       System.out.print("Please enter an integer value " + "(less than 2,147,483,648) as decimal digits: "); 
       scnr.nextLine(); 
       continue; 
      } 
      height = scnr.nextInt(); 
      if (height >= 0) { 
       // null statement 
      } else { 
       System.out.print("Please enter a positive integer value: "); 
       continue; 
      } 
      break; 
     } 

Вы можете просто добавить scnr.nextLine() удалить «старый» scnr осталось от предыдущего ввода. Это устраняет проблему разлива.

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