Получение пользовательского ввода со сканером

Я пытаюсь, чтобы сканер принимал ввод в цикле. Как только пользователь хочет закончить, он может выйти из этого цикла. Я пробовал много разных способов сделать это, но всегда есть какая-то проблема. Это код:

private void inputEntries() { Scanner sc = new Scanner(System.in); System.out.println("Continue?[Y/N]"); while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here System.out.println("Enter first name"); String name = sc.nextLine(); System.out.println("Enter surname"); String surname = sc.nextLine(); System.out.println("Enter number"); int number = sc.nextInt(); Student student = new Student(name, surname, number); students.add(student); try { addToFile(student); } catch (Exception ex) { Logger.getLogger(TextReader.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Continue?[Y/N]"); } } 

Проблема с вышеприведенным кодом, который также случается при разных методах, которые я пробовал, заключается в том, что когда пользователь вводит Y , Scanner пропускает первый ввод для имени и переходит к фамилии. Если пользователь набирает N, цикл останавливается правильно. Кто-то может объяснить причину этого, и как преодолеть использование classа Scanner ?

ps: Выполнение чего-то вроде while(sc.nextLine().equals("Y")) приведет к завершению цикла, прежде чем вводить пользователя после первого запуска цикла.

Это связано с тем, что вы используете Scanner#next метод Scanner#next . И если вы посмотрите на документацию этого метода, он вернет следующий токен.

Итак, когда вы читаете ввод пользователя с использованием next метода, он не читает newline в конце. Которая затем считывается nextLine() внутри цикла while. И, таким образом, ваше firstName содержит newline без вашего ведома.

Таким образом, вы должны использовать nextLine() в своем, а не в next() .

Аналогично в методе nextInt . Он также не читает новую строку. Таким образом, вы можете read с помощью readLine и преобразовывать его в int с помощью Integer.parseInt . Он может NumberFormatException если входное значение не может быть преобразовано в int . Поэтому вам нужно обращаться с ним соответствующим образом.

Вы можете попробовать следующий код: –

 Scanner sc = new Scanner(System.in); System.out.println("Continue?[Y/N]"); while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here System.out.println("Enter first name"); String name = sc.nextLine(); System.out.println("Enter surname"); String surname = sc.nextLine(); System.out.println("Enter number"); int number = 0; try { number = Integer.parseInt(sc.nextLine()); } catch (IllegalArgumentException e) { e.printStackTrace(); } System.out.println("Continue?[Y/N]"); } 

Но обратите внимание, что если вы введете значение, которое не может быть передано Integer.parseInt вы получите исключение, и этот ввод будет пропущен. В этом случае вам нужно обработать его, используя цикл while.

Или, если вы не хотите выполнять эту обработку исключений :

Вы можете добавить empty sc.nextLine() после sc.nextInt() , который будет использовать оставшуюся newline sc.nextInt() , например:

  // Left over part of your while loop String surname = sc.nextLine(); System.out.println("Enter number"); int number = sc.nextInt(); sc.nextLine(); // To consume the left over newline; System.out.println("Continue?[Y/N]"); 
  • Используйте equalsIgnoreCase(..) чтобы предотвратить случай, когда Y или N являются строчными буквами и наоборот.
  • Не используйте sc.next() скорее sc.nextLine() чтобы добиться того, чего вы хотите, потому что next() только читает до следующего места, а nextLine() читает до следующего \n перерыва.
  • Не используйте nextInt() прочитать все данные как String и затем преобразовать, потому что nextInt() подобен next() поэтому не читается до следующего \ n .

Попробуйте вот так:

 Scanner sc = new Scanner(System.in); System.out.println("Continue?[Y/N]"); while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here System.out.println("Enter first name"); String name = sc.nextLine(); System.out.println("Enter surname"); String surname = sc.nextLine(); System.out.println("Enter number"); int number=0; try { number = Integer.parseInt(sc.nextLine());//read int as string using nextLine() and parse }catch(NumberFormatException nfe) { nfe.printStackTrace(); } System.out.println("Continue?[Y/N]"); } 

Вы можете использовать

 String abc = "abc"; String answer = "null"; while (abc.equals("abc") { if (answer.equals("n") { break; } while (answer.equals("y")) { //Put your other code here System.out.print("Continue? [y/n]") answer = input.nextLine(); if (answer.equals("n") { break; } } } 

Это должно остановить программу, когда вход

 "n" 

Вам также придется импортировать и создавать сканер следующим образом:

 //This is how you import the Scanner import java.util.Scanner; //This is how you create the Scanner Scanner input = new Scanner(System.in); /** *The name */ "input" /** *is used because of */ input.nextLine 
 public void display() { int i, j; for (i = 1; i <= 5; i++) { for (j = i; j < 5; j++) { System.out.print(" "); } for (j = 1; j < (2 * i); j++) { System.out.print(i % 2); } for (j = 1; j < ((5 * 2) - (i * 2)); j++) { System.out.print(" "); } for (j = 1; j < (2 * i); j++) { System.out.print(j); } System.out.println(); } for (i = 4; i >= 1; i--) { for (j = i; j < 5; j++) { System.out.print(" "); } for (j = 1; j <= i; j++) { System.out.print(j); } for (j = i - 1; j >= 1; j--) { System.out.print(j); } for (j = 1; j < ((5 * 2) - (i * 2)); j++) { System.out.print(" "); } for (j = 1; j < (2 * i); j++) { System.out.print(j); } System.out.println(); } } 
  • Чтение CSV со сканером ()
  • Почему hasNextLine () никогда не заканчивается?
  • nextDouble () выдает исключение, когда я ввожу двойную
  • Сканер только считывает имя файла и ничего больше
  • Как использовать java.util.Scanner, чтобы правильно читать данные пользователя из System.in и действовать на него?
  • Закрыть сканер без закрытия System.in
  • В чем разница между методами next () и nextLine () из classа Scanner?
  • Невозможно использовать Scanner.nextInt () и Scanner.nextLine () вместе
  • Ошибка сканера с nextInt ()
  • Метод сканирования для получения символа
  • Чтение .txt-файла с использованием classа Scanner в Java
  • Interesting Posts

    Android Studio: установка приложения не выполнена

    Как создать несколько controllerов javafx с разными файлами fxml?

    Как пропустить / игнорировать / пропускать пустые литералы объектов в выпуске JSON?

    Как отобразить объект json с помощью * ngFor

    Захватите весь текст из html с помощью Html Agility Pack

    Быстрое окно с окном с гном-терминалом

    Получение «Несоответствующий модуль анонимного определения () …», когда я пытаюсь выполнить тесты

    Как генерировать AST из исходного кода Java?

    Как я могу выбрать элемент с несколькими classами в jQuery?

    Значение по умолчанию для boolean и Boolean в Java

    Какие переменные инициализируются в Delphi?

    Как определить, поддерживает ли Android PDF?

    Как получить доступ к экземплярам WebSockets в Jetty 9?

    Получение ошибки: не удалось найти class ‘android.app.AppOpsManager’, на который ссылается метод com.google.android.gms.common.GooglePlayServicesUtil.zza

    Как распознавать символы UTF-8 в кодированном латинском столбце – MySQL

    Давайте будем гением компьютера.