Ява.утиль.Сканер не возвращается к подсказке


import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            System.out.println(s.next());
        }
        s.close();
    }
}

Эта программа не возвращается в prompt (я запускал ее через терминал). Почему это так? Как я могу это исправить?

3 2

3 ответа:

эта программа не возвращается в prompt (я запускал ее через терминал). Почему это так?

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

Из документов:

возвращает true, если этот сканер имеет другой маркер на входе. Этот метод может быть заблокирован во время ожидания ввода для сканирования.

В системе unix вы можете завершить поток, набрав Ctrl+D , который корректно возвращает управление в приглашение, (или завершить всю программу, введя Ctrl+С ).

Как я могу это исправить?

Вы можете либо

  • зарезервировать некоторую входную строку, используемую для завершения программы, как предлагает JJ, или
  • вы можете полагаться на то, что пользователь закроет входной поток с помощью Ctrl+D, или вы можете
  • заключите петлю в try / catch и пусть другой поток прерывает основной поток, который затем изящно выходит.
  • сделайте System.in.close() программно из другого потока.

Это ответ на комментарий выше. Здесь приложение завершит работу при получении "quit".

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            String temp = s.next();
            if(temp.trim().equals("quit"))
                System.exit(0);
            System.out.println(s.next());
        }
        s.close();
    }
}

Сканер заблокирует ожидание ввода от System.in (стандартный ввод). Вы должны нажать Ctrl+C, чтобы выйти из программы, закрыть входной поток, нажав Ctrl+D или дать циклу условие выхода (например, набрав "quit"), вот как это можно сделать:

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            String nextVal = s.next();
            if (nextVal.equalsIgnoreCase("quit")) { break; }
            System.out.println(nextVal);
        }
        s.close();
    }
}