Как использовать java.util.Scanner, чтобы правильно прочитать пользовательский ввод из System.in и действовать на него?

Это должно бытьканонический вопрос / ответ это может быть использовано в качестве двойной цели. Эти требования основаны на самых распространенных вопросах, публикуемых каждый день, и могут добавляться по мере необходимости. Все они требуют одинаковой базовой структуры кода, чтобы добраться до каждого из сценариев, и, как правило, они зависят друг от друга.

Сканер выглядит как"просто" класс для использования, и именно здесь сделана первая ошибка. Это не просто, у него есть все виды неочевидных побочных эффектов и отклонений в поведении, которые нарушаютПринцип Наименьшего Удивления очень тонкими способами.

Так что это может показаться излишним для этого класса, но ошибки и проблемы с очисткой лука - всепростоно вместе взятые они оченьсложный из-за их взаимодействия и побочных эффектов. Вот почему так много вопросов об этом каждый день.

Общие вопросы сканера:

НаиболееScanner вопросы включают неудачные попытки более чем одной из этих вещей.

Я хочу, чтобы моя программа автоматически ожидала следующего ввода после каждого предыдущего ввода.

Я хочу знать, как обнаружитьвыход команда и завершить мою программу, когда эта команда введена.

Я хочу знать, как сопоставить несколько команд длявыход команда без учета регистра.

Я хочу иметь возможность сопоставлять шаблоны регулярных выражений, а также встроенные примитивы. Например, как сопоставить то, что кажется датой (2014/10/18 )?

Я хочу знать, как сопоставлять вещи, которые не могут быть легко реализованы с сопоставлением регулярных выражений - например, URL (http://google.com ).

Мотивация:

В мире Java,Scanner это особый случай, это очень привередливый класс, когда учителя не должны давать новым ученикам инструкции по использованию. В большинстве случаев инструкторы даже не знают, как правильно его использовать. Он вряд ли когда-либо используется в профессиональном производственном коде, поэтому его ценность для студентов крайне сомнительна.

С помощьюScanner подразумевает все остальные вещи, упомянутые в этом вопросе и ответе. Это никогда не толькоScanner речь идет о том, как решить эти общие проблемы сScanner которые всегда сопутствуют болезненным проблемам почти во всех вопросах, которые получаютScanner неправильно. Это никогда не толькоnext() противnextLine(), это всего лишь признак тонкости реализации класса, всегда есть другие проблемы в посте кода в вопросах, задающихScanner.

Ответ показывает полную идиоматическую реализацию в 99% случаев, когдаScanner используется и спрашивается о StackOverflow.

Особенно в коде для начинающих. Если вы считаете, что этот ответ слишком сложен, то пожаловаться учителям, которые говорят новым ученикам использоватьScanner Прежде чем объяснять тонкости, причуды, неочевидные побочные эффекты и особенности его поведения.

Scanner это отличный обучающий момент о том, как важноПринцип наименьшего удивления Именно поэтому согласованное поведение и семантика важны при именовании методов и аргументов методов.

Примечание для студентов:

Вы, вероятно, никогда не увидитеScanner используется в профессиональной / коммерческой линейке бизнес-приложений, потому что все, что она делает, лучше чем-то другим. Программное обеспечение реального мира должно быть более устойчивым и обслуживаемым, чемScanner позволяет писать код Реальное программное обеспечение использует стандартизированные парсеры форматов файлов и документированные форматы файлов, а недля этого случая форматы ввода, которые вам даны в отдельных заданиях.

Ответы на вопрос(1)

Ваш ответ на вопрос