Почему nextInt() игнорирует /n?

#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 методов работают, получая следующий токен и затем пытаясь проанализировать токен. Получение следующего токена означает:

  1. пропуск всех начальных символов-разделителей (по умолчанию пробел)
  2. чтение символов до, но не включая следующий символ-разделитель.

nextLine() Метод отличается. Он просто считывает все символы до следующей последовательности в конце строки включительно.


1 — … если только это не один из ведущих разделителей в точке, которая nextInt() вызывается!

Комментарии:

1. Не могли бы вы уточнить, что вы имеете в виду, если это один из ведущих разделителей?

2. Разделитель — это символ, который разделяет токены; то есть материал между токенами, который вы хотите игнорировать. Начальный разделитель — это разделитель, который находится перед токеном, который вы хотите прочитать; т. Е. Он «ведет» его. (И конечный разделитель является разделителем после токена.)

3. А, теперь я понимаю. Спасибо за четкий и краткий ответ.