2014-12-30 2 views
-1
Scanner input = new Scanner(System.in); 

while(input.hasNext()){ 


     System.out.println(input.nextInt()); 


     System.out.println("To go on,Enter any number"); 


    } 

Здесь как работает hasNext() заявление? Может ли кто-нибудь объяснить это подробно?Использование «hasNext()» Заявление

+5

Какая часть [Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNext()) неясна для вас? –

+0

Условие внутри оператора 'while' выполняется в начале первой итерации и в начале каждой последующей итерации замкнутого цикла. – Kon

+1

Обратите внимание, что 'hasNext' возвращает true, если остался какой-либо вход без пробелов, даже если он не является числом. Таким образом, возможно, что 'nextInt' может вызвать исключение. 'Scanner' также имеет метод' hasNextInt', чтобы увидеть, есть ли еще один токен, и он выглядит как целое число. Вы можете использовать оба варианта, т. Е. Сначала использовать 'hasNext()', чтобы увидеть, есть ли какой-либо вход, а затем 'hasNextInt()', чтобы убедиться, что это действительное целое число. – ajb

ответ

2

hasNext() говорит вам, есть ли еще элементы для чтения из потока.В этом случае вызов будет блокироваться до тех пор, пока не будет введен пользовательский ввод.

Есть три сценария:

  1. Пользователь не обеспечивает вход на все. Вызов будет блокироваться бесконечно.

  2. Пользователь предоставляет некоторые данные, которые не являются EOF. Возвращаемое значение будет true.

  3. Пользовательские входы EOF. Возвращаемое значение будет ложным.

В контексте вашей программы, это означает, что в то время как контур будет выполняться до тех пор, пока пользователь не дает EOF (Ctrl + D или Ctrl + Z). Если пользователь знает об этом, я полагаю, все будет хорошо.

Но поведение, безусловно, может быть более удобным: например, в настоящее время он просит пользователя ввести номер. Но hasNext() не имеет значения, является ли ввод числом или нет, цикл будет продолжаться вечно до тех пор, пока вход не будет EOF.

Другая проблема может возникнуть, если пользователь попытается предоставить некоторый предопределенный ввод через командную строку, если вход не был специально завершен с помощью EOF, программа будет блокироваться навсегда. В заявлении нет означает, что программа перестанет работать, когда больше нет ввода для чтения (если не указано EOF, конечно).

1

Основываясь на JavaDoc, hasNext():

  • Указано в интерфейсе Iterator<String>

  • Возвращает true, если этот сканер имеет еще один маркер в его входе. Этот метод может блокироваться, ожидая ввода для сканирования. Сканер не продвигается мимо любого входа

  • Броски IllegalStateException если этот сканер закрыт

В коде hasNext() используется для того, чтобы проверить, есть ли еще элементы для перебора в вашем iterateable коллекции , после завершения каждой итерации while.

+0

Не могли бы вы добавить комментарий к моему ответу, если downvoted? Спасибо. –

1

Scanner класса в соответствии с документацией реализует класс Iterator<String>

См here

Если класс реализует Iterator<T> то необходимо реализовать следующие функции

  • hasNext

Возвращает true, если итерация имеет больше элементов. (Другими словами, возвращает истину, если в следующем() возвращает элемент, а не бросать исключение.)

Специфическая для сканера документ определяет:

Возвращает истину, если этот сканер имеет еще один маркер в его входе , Этот метод может блокироваться, ожидая ввода для сканирования. Сканер не продвигается мимо какого-либо входа.

  • следующая

Возвращает следующий элемент в итерации.

  • удалить

    Удаляет из основной коллекции последний элемент, возвращенный этой итератора (дополнительная работа). Этот метод можно вызвать только один раз для каждого вызова next(). Поведение итератора не определено, если базовая коллекция модифицирована, пока итерация выполняется каким-либо образом, кроме как путем вызова этого метода.

Источник: Iterator doc

+0

Это действительно не отвечает на вопрос. Хотя «Сканер» реализует «Итератор», я никогда не видел его в качестве итератора. Вопроситель хочет знать, что такое поведение 'hasNext()' в отношении того, как функционирует «Сканер», и этот ответ идет об итераторах без какой-либо информации о «Сканере». – ajb

+0

вопрос просто спрашивает о инструкции hasNext, которая является реализацией класса итератора. и я отвечаю на этот вопрос полужирным: возвращает true, если итерация имеет больше элементов –

+0

Я добавил реализацию hasNext, специфичную для сканера –

0

Сканер просматривает весь ваш пользовательский ввод, который он получает. Поэтому в основном правильные стандарты кодирования сосредоточены на том, как вы справляетесь с непредвиденными ситуациями. Таким образом, метод hasNext() в основном проверяет пробел или разрыв строки после текущей позиции и проверяет наличие двоичных значений после этого. Если присутствует, он возвращает true и если не возвращает false.

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