有没有人看到这个问题?第一个输入工作正常,但在第一个循环之后,它不会要求再次输入值。我该如何解决这个问题?
int value;
while(true)
{
Scanner scan = new Scanner(System.in);
System.out.println("Enter a value");
try
{
value = scan.nextInt();
System.out.println("value provided is: " + value);
scan.nextLine(); // consumes "\n" character in buffer
}
catch(InputMismatchException e) // outputs error message if value provided is not an integer
{
System.out.println("Incorrect input type. Try again.");
continue; // restarts while loop to allow for re-entering of a valid input
}
scan.close();
}
答案 0 :(得分:5)
将scan.close();
移至while
循环之外。
此外,您不必在每次迭代时构建 new Scanner
。将声明也移到循环外部。
所以现在当你尝试再次实例化它时,它找不到任何打开的流,你会得到那个例外。
答案 1 :(得分:0)
在while循环结束时,您编写了scan.close()
。这将关闭扫描仪,防止进一步扫描。删除该语句将确保您的while循环不断询问您的数字(在您的情况下将是一个无限循环)
此外,scan.nextInt()
实际上会忽略所有新行并等待,直到您实际输入一个数字并按Enter键。因此,scan.nextLine()
可以省略。只有在您使用scan.nextLine()
获取输入的值时才需要。在这种情况下,新行字符也会被读取为输入,因此您需要额外的nextLine()调用来使用它。
答案 2 :(得分:0)
当您执行scan.close()
时,它会关闭基础System.in
流。因此,在下一次迭代中,它将无法阅读。
例如:
import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int value;
while (true) {
Scanner scan = new Scanner(System.in);
System.out.println("Enter a value");
try {
value = scan.nextInt();
System.out.println("value provided is: " + value);
scan.nextLine(); // consumes "\n" character in buffer
} catch (InputMismatchException e) // outputs error message if value
// provided is not an integer
{
System.out.println("Incorrect input type. Try again.");
continue; // restarts while loop to allow for re-entering of a
// valid input
}
scan.close();
try {
int x = System.in.read();
System.out.println(x);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
输出:
Enter a value
10
value provided is: 10
Enter a value
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:206)
at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
at Main.main(Main.java:24)
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at Main.main(Main.java:12)
查看此问题了解更多信息:
Is it safe not to close a Java Scanner, provided I close the underlying readable?