简短的回答是:

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");
}
}