java.util.Scanner不会返回提示
该程序不会返回提示符(我一直在通过终端运行它)。为什么呢?如何更正?扫描仪将阻止等待System.in(标准输入)的输入。您必须按Ctrl+C退出程序,按Ctrl+D关闭输入流,或给循环一个退出条件(如键入“退出”),以下是您可以做到的方法:java.util.Scanner不会返回提示,java,java.util.scanner,Java,Java.util.scanner,该程序不会返回提示符(我一直在通过终端运行它)。为什么呢?如何更正?扫描仪将阻止等待System.in(标准输入)的输入。您必须按Ctrl+C退出程序,按Ctrl+D关闭输入流,或给循环一个退出条件(如键入“退出”),以下是您可以做到的方法: import java.util.Scanner; class newClass { public static void main(String args[]) { Scanner s = new Scanner(System.
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();
}
}
此程序不会返回提示符(我一直在通过终端运行它)。为什么会这样?
因为s.hasNext()
将阻塞,直到进一步的输入可用,并且只有在遇到流结束时才会返回false
从文档中:
如果此扫描仪的输入中有另一个令牌,则返回true此方法在等待输入扫描时可能会阻塞。
在unix系统上,您可以通过键入Ctrl+D来结束流,这将正确地将控制权返回到提示符(或者通过键入Ctrl+C来终止整个程序)
我如何更正它?
你也可以
- 按照JJ的建议,保留一些用于终止程序的输入字符串,或
- 您可以依靠用户使用Ctrl+D关闭输入流,也可以
- 将循环包含在try/catch中,让另一个线程中断主线程,然后主线程优雅地退出
- 从另一个线程以编程方式执行
System.in.close()
- 这是对上述评论的回复。在这里,当收到“退出”时,应用程序将退出
等待回复“当我键入quit时,它只是回显“quit”一词,仍然没有退出”…quit不等于EOF。你必须有一个if来比较输入和“quit”字符串,这样才能起作用。我猜他的意思是你必须保留一个类似“quit”的单词,并在
while
循环条件中检查它。或者通过按Ctrl+D关闭输入流。谢谢你给出了完整的答案。还有一件事。假设我为System.exit(0)保留了“退出”一词,那么如果我输入了“我不能退出巧克力”。这也将在退出时结束,并进入提示。因此,我认为应该在程序的开头添加一行,要求用户按Ctrl+C结束。只是一个请求。你能把try/catch解决方案贴在什么地方吗?。谢谢。那么,什么可以用于流的末尾呢?有任何分隔符吗?只需执行,尝试{your while loop}catch(InterruptedException ie){优雅地退出}
,然后从另一个线程执行if(exitCondition)mainThread.interrupt()
。
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();
}
}
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();
}
}