2015-09-26 2 views
2

Я пытаюсь понять, как работают эти три метода. Вот как я их понял:Понимание методов nextLine(), next() и nextInt() сканера

  • nextLine() читает оставшуюся часть текущей строки, даже если она пуста.
  • nextInt() читает целое число, но не считывает escape-последовательность "\ n".
  • next() считывает текущую строку, но не читает «\ n».

Предположим, у меня есть следующий код:

import java.util.Scanner; 

public class Welcome2 
{ 
    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Next enter two words:"); 

     int n; 
     String s1, s2; 

     n = keyboard.nextInt(); 
     s1 = keyboard.next(); 
     s2 = keyboard.nextLine(); 
     System.out.println(" n is " + n + " s1 is " + s1 + " s2 is " + s2); 
    } 
} 

Если мой вход:

2 

Hi 

Hello 

Тогда я получаю следующий вывод на экран:

n is 2 
s1 is hi 
s2 is 

Почему s1 имеют значение «HI»?

Означает ли это, что метод next() читает следующую строку, даже если символ перехода для первой строки не был прочитан nextInt()?

+4

'next()' не читает текущую строку - он читает следующий * токен *. Как вы ввели это «2 Привет Привет»? Если вы дважды нажмете возврат, программа закончится, прежде чем вы войдете в «Привет» ... –

+0

Я ввел первое значение, нажмите enter, а затем нажмите enter, третий. Я просто нажимаю один раз между моими входами. – bangbang

+1

Вы используете это из командной строки? Вы уверены, что используете * точный * код, который вы разместили? Потому что, когда я запустил это и попробую точную последовательность, которую вы сказали, она печатает «n is 2 s1 is Hello s2 is» и не дает мне времени на ввод «Привет» вообще.Обратите внимание, что ваш выборка выводится также на три строки, которые ваш образец кода не даст. Я подозреваю, что вы не опубликовали фактический код, который вы используете. (Если вы измените код, пожалуйста, уделите время его форматированию, так как у меня есть для вашего текущего кода. * Сложно читать код, который не был отступом соответствующим образом.) –

ответ

4

nextLine() считывает оставшуюся часть текущей строки, даже если она пуста.

Исправить.

nextInt() считывает целое число, но не считывает escape-последовательность "\ n".

Исправить .

next() считывает текущую строку, но не читает «\ n».

Неверно. На самом деле, метод next() читает следующий полный токен. Это может быть или не быть остальной частью текущей строки. И он может или не может потреблять конечную линию, в зависимости от того, где находится конец строки. Точное поведение описывается javadoc, и вам, вероятно, нужно внимательно его прочитать для того, чтобы вы могли полностью понять нюансы.

Таким образом, в вашем примере:

  1. Вызов nextInt() потребляет 2 характер и оставляет место на NL.

  2. Следующий() звонок пропускает NL, потребляет H и i и оставляет курсор на втором NL.

  3. Звонок следующей линии() потребляет остальную часть второй линии; т.е. NL.


1 ... за исключением того, что ваша терминология неправильно. Когда данные считываются, это не escape-последовательность. Это последовательность конца строки, которая может состоять из CR, NL или CR NL в зависимости от платформы. Управляющие последовательности, о которых вы говорите, находятся в исходном коде Java, в строковых и символьных литералах. Они могут >> представлять < < CR или NL или ... другие символы.

1

Если вход 2 hello hi

nextInt() - просто прочитать следующую лексему как межд (здесь - это 2) в противном случае он дает ошибку

следующая() - Просто прочитайте следующую лексему, (здесь - это hello)

nextline() - это прочитать строку, пока не получит символ новой строки (здесь - после чтения предыдущего 2 hello входного сигнала nextInt, рядом; nextline читать hi только потому, что после того, что он находит символ новой строки)

если вход

2 

Hi 

Hello 

nextInt, следующий же для обсуждения выше.

В следующей строке() он находит новую строку после заполнения ввода Hi, читает next(). Итак, nextline() перестает читать ввод для получения символа новой строки.

-1

Означает ли это, что метод next() читает следующую строку, даже если escape-символ для первой строки не был прочитан nextInt()?

NO.

  1. next() не может прочитать следующую строку, она читает только что-то прежде, чем пространство.

  2. Когда выполняется keyboard.nextLine(), он потребляет «конец строки» все еще в буфере с первого входа.

  3. , когда вы вводите номер, затем нажмите Enter, keyboard.nextInt() потребляет только номер, а не «конец строки».

Использование следующего() будет возвращать только то, что идет перед пробелом. nextLine() автоматически переводит сканер вниз после возврата текущей строки.

+0

Фактически 'next()' ** может ** потреблять новую строку, потому что новые строки включены в шаблон разделителя по умолчанию «белый пробел». Javadoc говорит: * «Разделитель пробелов по умолчанию, используемый сканером, так же распознан Character.isWhitespace». * И на самом деле, в примере OP это ** делает ** потребляет новую строку; т.е. после символа «2». Конечно, он не включает символы разделителя в строке, которую он возвращает ... но это отдельная проблема. –

Смежные вопросы