对于大学作业,从控制台我需要能够读取多行直到用户输入Ctrl + Z。我没有问题,我的问题在于我之后无法从System.in中读取任何内容,因为它总是抛出NoSuchElementException。
以下是我用于读取多行的代码,它是由教师提供的,因此我不想更改它。
System.out.println("To terminate input, type the correct end-of-file indicator ");
System.out.println("when you are prompted to enter input.");
System.out.println("On UNIX/Linux/Mac OS X type <ctrl> d");
System.out.println("On Windows type <ctrl> z");
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
//Processes input
addFileIntoDirectory(input.nextLine());
}
我知道这是由Ctrl + Z引起的,它等同于EOF标记,但我不知道如何移过它。无论我做了多少次读取,无论我是否输入更多的控制台,我都会立即获得另一个NoSuchElementException。
我尝试过为菜单设置一个单独的扫描仪,关闭上面的扫描仪并为菜单打开一个新的扫描仪,但都不起作用。
有没有办法刷新/清除System.in或重置它?
如果您想了解更多详情,请与我们联系。我把这个程序的其余部分保持模糊,因为它是作业。
编辑1:作业说“系统提供如下文字选择菜单, 循环运行。“这意味着程序不会在Ctrl + Z上终止。
- 从用户输入中添加文件
- 显示整个目录
- 显示目录的大小
- 出口 请选择[0-4]:
醇>
答案 0 :(得分:3)
简短的回答是:
if (!input.hasNext())
input = new Scanner(System.in);
答案很长:
下面是代码,其中包含了稍后删除的注释,以便根据我的理解和解决方案来演示问题。
请注意,此演示仅适用于使用整数和^Z
输入的工作。
复制出代码并保存到文件HN.java
进行编译。
运行该程序,它将提示 One 。输入整数到您心中的内容,然后输入^Z
退出循环。
将显示两个,然后显示问题中的NoSuchElementFound exception
。这是因为^Z
在扫描程序对象input
中仍然是,因此nextInt()
方法失败。
第一个倾向可能是使用hasNext()
来解释这个问题。因此,请继续取消注释/*Comment1
并重新编译并再次运行。
现在你避免了这个例外,但程序一直持续到最后,跳过最初想要的nextInt()
。
现在,取消注释/*Comment2
,重新编译,然后再次运行。现在,程序将按照预期在两个提示符处等待。如果您在此输入一个整数,您将进入三提示以获取另一个条目。
但是,如果您再次在两次处输入^Z
,程序将跳过下一个输入。要更正此问题,请取消注释/*Comment3
,重新编译和运行,您将看到该程序适用于所有整数组合,并且^Z
可用于各种输入。
现在,您可能想知道我为什么不重用!input.hasNext()
中的/*Comment3
解决方案。这是一个演示原因:
放回/*Comment3
并取消注释/*Comment4
,再次编译并运行。该程序在两个提示下输入^Z
时效果很好,但是如果你在那里输入一个整数,你会看到系统在等待输入,但是没有提示三!
这是因为您输入的整数用于前面的nextInt()
,因此当程序到达hasNext()
时,它会停止并等待输入。
这里的教训是,当您知道队列中有!input.hasNext()
时,使用^Z
,例如当它用于在此程序中转义while循环时原始海报的问题。否则,其他结构更适合。
hasNext()
令人困惑。你必须记住,如果队列中没有,程序将停止并等待该点的输入。如果你不小心,这可能会搞砸你的提示。
import java.util.Scanner;
public class HN
{
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
int temp = 0;
System.out.println("One");
while (input.hasNext())
{
temp = input.nextInt();
}
System.out.println("Two");
/*Comment2
if(!input.hasNext()) input = new Scanner(System.in);
Comment2*/
/*Comment1
if (input.hasNext())
Comment1*/
{
temp = input.nextInt();
System.out.printf("%d\n", temp);
}
/*Comment3
else input = new Scanner(System.in);
Comment3*/
/*Comment4
if(!input.hasNext()) input = new Scanner(System.in);
Comment4*/
System.out.println("Three");
if (input.hasNext())
{
temp = input.nextInt();
System.out.printf("%d\n", temp);
}
System.out.println("Four");
}
}