#java #java.util.scanner #user-input
#java #java.util.scanner #пользовательский ввод
Вопрос:
Я столкнулся с проблемой с моим кодом, которую, к счастью, смог решить с помощью другого аналогичного вопроса здесь, но мне любопытно, почему это происходит.
Вот упрощенная версия моей программы:
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
while(!input.equals("x")){
if(input.equals("m")){
String temp = scan.nextLine();
String entry = scan.nextLine();
}
else if(input.equals("f")){
String color = scan.nextLine();
int nothing = scan.nextInt();
}
System.out.println("Enter 'm' for mascara, 'f' for foundation, 'x' to exit");
System.out.println("Entry? :");
input = scan.nextLine();
}
}
С этим кодом ввод ‘m’ не вызовет у меня никаких проблем, но ‘f’ заставит меня напечатать наши две строки дважды. Почему именно это происходит с nextInt(), а не с nextLine()?
'm'
Enter 'm' for mascara, 'f' for foundation, 'x' to exit
Entry? :
'f'
Enter 'm' for mascara, 'f' for foundation, 'x' to exit
Entry? :
Enter 'm' for mascara, 'f' for foundation, 'x' to exit
Entry? :
Ответ №1:
Почему
nextInt()
игнорируется n?
Он не игнорирует это. Он просто не читает его1.
На самом деле, это nextLine
метод, который здесь является аномальным. Большинство next
методов работают, получая следующий токен и затем пытаясь проанализировать токен. Получение следующего токена означает:
- пропуск всех начальных символов-разделителей (по умолчанию пробел)
- чтение символов до, но не включая следующий символ-разделитель.
nextLine()
Метод отличается. Он просто считывает все символы до следующей последовательности в конце строки включительно.
1 — … если только это не один из ведущих разделителей в точке, которая nextInt()
вызывается!
Комментарии:
1. Не могли бы вы уточнить, что вы имеете в виду, если это один из ведущих разделителей?
2. Разделитель — это символ, который разделяет токены; то есть материал между токенами, который вы хотите игнорировать. Начальный разделитель — это разделитель, который находится перед токеном, который вы хотите прочитать; т. Е. Он «ведет» его. (И конечный разделитель является разделителем после токена.)
3. А, теперь я понимаю. Спасибо за четкий и краткий ответ.