Вместо scan.nextInt()
я бы снова использовал scan.nextLine()
, а затем проанализировал ввод. Если вы получаете NumberFormatException
, вы можете лаять на пользователя, что ввод был инкрустацией.
Причина, по которой вам нужно сделать что-то вроде этого, заключается в том, что у вас все еще есть символ новой строки, расположенный в конце ввода вашего serverPort. Когда вы используете nextInt()
, сканер захватывает весь следующий токен и пытается преобразовать его в Integer
. Все, что находится после целочисленного токена, остается сканировать.
Чтобы доказать это, с вашим исходным кодом, если вы поместите разделитель токенов, например, пробел, после ввода порта сервера, а затем добавите какой-то текст, вы обнаружите, что ваше последующее назначение userName
будет получено с конца номер до следующей новой строки.
System.out.println("\nEnter port number:");
Integer serverPort = scan.nextInt();
System.out.println("\nEnter your username:");
String userName = scan.nextLine();
System.out.println("\nserverPort: " + serverPort
+ "\nuserName: " + userName);
с вводом:
Enter port number:
123 abc
Enter your username:
выведет
serverPort: 123
userName: abc
Это потому, что пробел действует как разделитель токенов, и после вызова scan.nextInt()
пробел и abc
все еще остаются в буфере. Когда вызывается последующий scan.nextLine()
, пробел и abc
сканируются из буфера.