Почему этот фрагмент кода выполняет два оператора println вместо того, чтобы печатать один за другим?

Scanner sc4 = new Scanner(System.in);
System.out.println("\nEnter the ID of the student you want to update!: ");
int id = sc4.nextInt();
System.out.println("Print1!");
String name = sc4.nextLine();
System.out.println("Print2!");
String address = sc4.nextLine();
System.out.println("Enter the updated contact Number of the student: ");
String contact = sc4.nextLine();
System.out.println("Enter the updated CourseID of the student: ");
int courseId = sc4.nextInt();
studentService.updateStudentById(id, name, address, contact, courseId);
break;

Этот код печатает Enter the ID of.. один раз и после получения ввода от меня печатает как Print1, так и Print2. Почему это происходит?

Использование сканера перед каждым оператором печати решает эту проблему, но мне нужен хороший подход к программированию.


person Aakash Thakur    schedule 16.02.2021    source источник


Ответы (2)


Используйте java.util.Scanner#next(), если вы хотите добавить новое значение в буфер.

Если вы намеренно использовали java.util.Scanner#nextLine() для отображения данных из буфера, вам нужно что-то поместить в буфер (какую-то строку).

https://www.tutorialspoint.com/java/util/scanner_nextline.htm

person Vova Perebykivskyi    schedule 16.02.2021

Более полный ответ подробно описан здесь, но чтобы дать обзор, nextInt() использует только целое число, которое вы указываете в консоли, но оставляет символ новой строки \n как есть. Когда nextLine() вызывается после nextInt(), он потребляет этот символ \n и продвигается вперед (в основном читая пустую строку). Такое поведение можно исправить несколькими способами.

Один из способов — использовать nextLine() вместо nextInt(), а затем привести к int, используя следующий код String s = sc.nextLine();.

int id = Integer.valueOf(s);

В качестве альтернативы вы можете добавить дополнительный sc.nextLine() после sc.nextInt(), чтобы использовать символ новой строки, а затем продолжить свой код. Интересным фактом является то, что если вы делаете несколько вызовов sc.nextInt(), то вам нужно сделать только один вызов sc.nextLine() в конце, чтобы использовать последний символ новой строки. Все предыдущие символы новой строки уже пропущены системным вводом!

person NoviceCoder    schedule 16.02.2021