Как завершить сканирование при завершении ввода?

public static void main(String[] args) { Scanner scan = new Scanner(System.in); try { while (scan.hasNextLine()){ String line = scan.nextLine().toLowerCase(); System.out.println(line); } } finally { scan.close(); } } 

Просто интересно, как я могу закончить программу после того, как я закончу вход? Поскольку сканер по-прежнему будет продолжать после нескольких «Ввод», предполагая, что я собираюсь продолжать вводить данные … Я попытался:

 if (scan.nextLine() == null) System.exit(0); 

а также

 if (scan.nextLine() == "") System.exit(0); 

Они не сработали … Программа продолжается и смешивается с первоначальным намерением,

Проблема в том, что программа (например, ваша) не знает, что пользователь выполнил ввод входных данных, если пользователь … как-то … не говорит об этом.

Пользователь может сделать это двумя способами:

  • Введите маркер «конец файла». В UNIX это (обычно) CTRL + D и в Windows CTRL + Z. Это приведет к тому, что hasNextLine() false .

  • Введите специальный ввод, который распознается программой как означающий «Я сделан». Например, это может быть пустая строка или какое-то особое значение, например «exit». Программа должна проверить это специально.

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


Причина, по которой ваша текущая версия терпит неудачу, заключается в том, что вы используете == для проверки пустой String. Вы должны использовать методы equals или isEmpty . (См. Как сравнить строки в Java? )

Другие вещи, которые следует учитывать, – чувствительность к регистру (например, «выход» или «выход»), а также эффекты пропущенных или конечных пробелов (например, «выход» против «выхода»).

Сравнение строк выполняется с использованием .equals() а не == .

Итак, попробуйте scan.nextLine().equals("") .

Вам нужно будет найти конкретный шаблон, который указывает, что конец вашего ввода говорит, например, «##»

 // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); try { while (scan.hasNextLine()){ String line = scan.nextLine().toLowerCase(); System.out.println(line); if (line.equals("##")) { System.exit(0); scan.close(); } } } finally { if (scan != null) scan.close(); } 

При таком подходе вы должны явно создать команду exit или условие выхода. Например:

 String str = ""; while(scan.hasNextLine() && !((str = scan.nextLine()).equals("exit")) { //Handle string } 

Кроме того, вы должны обрабатывать строки, равные случаям с .equals() not == . == сравнивает адреса двух строк, которые, если они не являются фактически одним и тем же объектом, никогда не будут истинными.

В этом случае я рекомендую вам использовать do, while вместо while.

  Scanner sc = new Scanner(System.in); String input = ""; do{ input = sc.nextLine(); System.out.println(input); } while(!input.equals("exit")); sc.close(); 

Чтобы выйти из программы, вам просто нужно назначить заголовок строки, например exit. Если вход равен выходу, программа выйдет. Кроме того, пользователи могут нажать кнопку управления + c для выхода из программы.

Вы можете проверить следующую строку ввода с консоли и проверить свою запись о завершении (если она есть).

Предположим, что ваша завершающая запись «quit», тогда вы должны попробовать этот код:

 Scanner scanner = new Scanner(System.in); try { while (scanner.hasNextLine()){ // do your task here if (scanner.nextLine().equals("quit")) { scanner.close(); } } }catch(Exception e){ System.out.println("Error ::"+e.getMessage()); e.printStackTrace(); }finally { if (scanner!= null) scanner.close(); } 

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

  • Как сохранить текущую дату / время, когда я добавлю новое значение в базу данных Firebase Realtime
  • Преобразование долготы / широты в координату X / Y
  • Как отобразить два столбца ListView в Android?
  • Как создать classы Java из файла WSDL
  • Как создать Android-hashи Facebook Facebook?
  • Ошибка манифеста слияния
  • Загрузка Android из URL в Bitmap
  • Как я могу представить диапазон в Java?
  • Обнаружение изменений состояния, внесенных в BluetoothAdapter?
  • Is -Djava.library.path = ... эквивалентно System.setProperty ("java.library.path", ...)
  • Как отформатировать продолжительность в java? (например, формат H: MM: SS)
  • Interesting Posts

    Плохо ли использовать два слота, которые не смежны друг с другом?

    Разделение разделенной запятой строки в PL / SQL хранимой процедуре

    Изменение настроек по умолчанию в Sublime Text 3

    Отображение типа CLR типа EDM неоднозначно с EF 6 и 5?

    Изменение размера ImageView для соответствия формату

    Проект Xamarin не работает, assembly не найдена

    Как сократить локальные ветви отслеживания, которые больше не существуют на удаленном компьютере

    Удалить «Файл данных Outlook»

    Как получить отпечаток сертификата подписчика (SHA1) для OAuth 2.0 на Android?

    После последних обновлений Win8.1×64 моя система застряла при перезагрузке или отключении.

    Была ли скорость процессора уже нарушена законом Мура?

    Можно ли удалить не новый объект?

    RequireJS – чувствителен к jQuery?

    Показать текущее местоположение внутри fragmentа карты Google

    Согласование шаблонов Scala с именем переменной нижнего регистра

    Давайте будем гением компьютера.