Простыми словами ... Если я пишу новый класс Swimmer для добавления функциональности swim () и вам нужно использовать объект класса say Dog, и этот класс Dog реализует интерфейс Animal, который объявляет swim () [To лучше понять ... вы можете нарисовать диаграмму о том, о чем я говорю]. В верхней части иерархии (Animal) он очень абстрактный, а внизу (Dog) он очень конкретный. То, как я думаю о «программировании для интерфейсов», заключается в том, что, когда я пишу класс Swimmer, я хочу написать свой код против интерфейса, который находится так далеко от иерархии, которая в этом случае является объектом Animal. Интерфейс свободен от деталей реализации и, таким образом, делает ваш код слабосвязанным. Детали реализации могут быть изменены со временем, однако это не повлияет на оставшийся код, поскольку все, с чем вы взаимодействуете, связано с интерфейсом, а не с реализацией. Вам все равно, что такое реализация ... все, что вы знаете, это то, что будет класс, который будет реализовывать интерфейс.
У вас есть пустая строка в конце файла.
Если вы берете контент и сохранить его, например, в txt-файл, некоторые редакторы добавят пустую новую строку в ваш файл.
Редакторы ведут себя таким образом, потому что это часть POSIX Стандарт:
3.206 Линия
Последовательность из нуля или более символов без символа окончания.
Этот раздел был обсуждался в этот поток .
Документация по Java-сканеру
Вот документация из класса g2 для Java 8 Scanner .
hasNext()
Возвращает true, если этот сканер имеет другой токен на своем входе.
hasNextLine()
Возвращает true, если на входе этого сканера есть еще одна строка.
Причина поведения кода Java
Из-за вышеописанных фактов
hasNextLine()
returntrue
, ноhasNext()
не может найти ничего, что он может распознать какToken
и поэтому возвращаетfalse
.Для дополнительной информации см. durron597 post.
Причина в том, что hasNext()
проверяет, имеются ли какие-либо символы без пробелов. hasNextLine()
проверяет, имеется ли другая строка текста.
Многие текстовые редакторы автоматически добавляют новую строку в конец файла, если нет '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' t / уже.
Другими словами, ваш входной файл не является этим (числа являются номерами строк):
1. a 3 9
2. b 3 6
3. c 3 3
4. d 2 8
5. e 2 5
На самом деле это:
1. a 3 9
2. b 3 6
3. c 3 3
4. d 2 8
5. e 2 5
6.
Вы потребляете значение next()
, но запрашиваете hasNext()
и hasNextLine()
. next()
, по умолчанию, возвращает все к следующему whitespace()
. Таким образом, вы выполняете итерацию через все разделенные пробелы строки, и после каждого из них вы спрашиваете о nextLine()
.
i 1 1
-> hasNextLine()
? Правда. hasNext()
? Также верно.
1 1
-> hasNextLine()
? Правда. hasNext()
? Также верно (все еще осталось пробел)
1
-> hasNextLine()
? True (Линейный разделитель, возможно). haxNext? False, без пробелов.
Основная концепция hasNext () и hasNextLine () is
hasNextLine: - Возвращает true, если на входе этого сканера есть другая строка. Этот метод может блокироваться при ожидании ввода.
Возвращает: true тогда и только тогда, когда этот сканер имеет другую строку ввода. Throws: IllegalStateException - если этот сканер закрыт
hasNext
]Возвращает true, если следующий полный токен соответствует указанному шаблону.
Полный токен имеет префикс и постфиксацию с помощью ввода, который соответствует шаблону разделителя. Этот метод может блокироваться при ожидании ввода.
Параметры: pattern - шаблон для сканирования для
Возвращает: true тогда и только тогда, когда этот сканер имеет другой токен, соответствующий указанному шаблону
Поскольку ваш последний вход говорит true для nextLine (), потому что вызов scan.nextLine (); возвращает следующий токен. Важно отметить, что сканер возвращает пробел и букву, потому что она читается с конца последнего токена до начала следующей строки.
"You have a single extra newline at the end of your file."
- Я думаю, что это более общее, чем это, в том числе - в конце файла есть любое количество пробелов (или какой бы ограничитель вы указали). – Dukeling 13 August 2015 в 23:26