Ява.утиль.Сканер не возвращается к подсказке
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 ответа:
эта программа не возвращается в 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(); } }