Сканер на Java не работает - PullRequest
4 голосов
/ 13 июля 2010

Я пытаюсь написать очень простую игру по угадыванию чисел (код ниже).После завершения 1 раунда пользователь должен решить, хочет ли он / она сыграть еще один раунд или нет.Проблема в том, что программа всегда пропускает последний вопрос (никогда не позволяя пользователю ответить «у» или иным образом. Что мне здесь не хватает?

Ответы [ 2 ]

11 голосов
/ 13 июля 2010

Используйте want = scan.next(); вместо nextLine().

Причина вашей проблемы в том, что после предыдущего nextInt() вы все еще находитесь на той же строке, а nextLine() возвращает остаток текущей строки.

Вот маленький фрагмент для воспроизведения поведения:

Scanner sc = new Scanner(System.in);
System.out.println("nextInt() = " + sc.nextInt());
System.out.println("nextLine() = " + sc.nextLine());

Когда вы набираете, скажем, 5, а затем нажимаете Введите , вывод будет:

nextInt() = 5
nextLine() = 

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

Для сравнения, если вы наберете, скажем, 5 yeah!, а затем нажмете Введите , тогда вы получите:

nextInt() = 5
nextLine() =  yeah!

Обратите внимание, что " yeah!" на самом деле происходит из той же строки, что и 5. Это точно так, как указано в документации:

String nextLine(): этот сканер перемещается дальше текущей строки и возвращает пропущенный ввод. Этот метод возвращает остаток текущей строки , исключая любой разделитель строк в конце. Позиция установлена ​​в начале следующей строки.


На полуоткрытых диапазонах

Предполагая, что угадываемое число находится в диапазоне от 1 до 10 включительно, следующий код является "неправильным":

numRandom = rand.nextInt(9)+1; // this can only be in 1..9 range inclusive!

Вот выдержка из документации java.util.Random:

int nextInt(int n): возвращает псевдослучайное, равномерно распределенное значение типа int между 0 (включительно) и указанным значением (исключая)

То есть, подобно многим методам в Java API, Random.nextInt(int) использует полуоткрытый диапазон с включающей нижней границей и исключительной верхней границей.

Похожие вопросы

1 голос
/ 07 апреля 2017

Вместо этого используйте scan.next()+ scan.nextLine();, например.

Scanner scan = new Scanner(System.in);

String s = scan.nextLine() +scan.nextLine();

Проблема возникает из-за того, что последний символ новой строки для последней строки ввода все еще находится в очереди во входном буфере, а следующая nextLine() будет читать остатоклинии (которая пуста).Таким образом, когда вы используете next, он переходит к следующему токену, тогда вы можете получить оставшиеся данные, используя nextLine()

...