为什么扫码器读取没有输入和退出功能?
Why is scanner reading no input and exiting function?
我创建了一个方法来询问用户他们最喜欢的号码。当我在 main 中多次调用此函数时,此后的所有方法调用都将跳转到关闭并声明 Your favorite number is: 0
而无需输入。我想知道为什么新的扫描仪正在读取并且不接受任何输入。
public static void favNumber(){
Scanner scanner = new Scanner(System.in);
System.out.println("Enter you favorite number: ");
int favNumber = 0;
boolean hasNextInt = scanner.hasNextInt();
if(hasNextInt){
favNumber = scanner.nextInt();
scanner.nextLine(); //reads enter character
}
System.out.println("Your favorite number is: " + favNumber);
scanner.close();
}
您的 Scanner
实例包装 System.in
(stdin)。当您在方法结束时调用 scanner.close()
时,除了扫描仪之外,您实际上还关闭了 System.in
。一旦输入流关闭,就不能再打开了。
解决方案当然是共享扫描程序的单个实例。我注意到您使用的是静态方法,因此我将在以下示例中同样使用静态实例。请注意我是如何创建扫描器的,然后调用 favNumber()
,并且仅在完成调用 favNumber()
后才关闭扫描器。这允许我多次调用 favNumber()
并共享同一个扫描器实例。
private static Scanner scanner; // note that this is a class-level static variable.
public static void main(String[] args) throws Exception {
try {
scanner = new Scanner(System.in); // create the scanner
favNumber(); // call the method
} finally {
scanner.close(); // only close the scanner when we're completely done
}
}
public static void favNumber(){
System.out.println("Enter you favorite number: ");
int favNumber = 0;
boolean hasNextInt = scanner.hasNextInt();
if(hasNextInt){
favNumber = scanner.nextInt();
scanner.nextLine(); //reads enter character
}
System.out.println("Your favorite number is: " + favNumber);
}
另一种解决方案是将扫描器实例作为方法参数传递,如下所示:
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in); // create the scanner
favNumber(scanner); // call the method, pass the scanner
scanner.close(); // only close the scanner when we're completely done
}
public static void favNumber(Scanner scanner){
System.out.println("Enter you favorite number: ");
int favNumber = 0;
boolean hasNextInt = scanner.hasNextInt();
if(hasNextInt){
favNumber = scanner.nextInt();
scanner.nextLine(); //reads enter character
}
System.out.println("Your favorite number is: " + favNumber);
}
您可以在此处的此问答中阅读有关关闭扫描仪包装 System.in 的更多信息:Close a Scanner linked to System.in
我创建了一个方法来询问用户他们最喜欢的号码。当我在 main 中多次调用此函数时,此后的所有方法调用都将跳转到关闭并声明 Your favorite number is: 0
而无需输入。我想知道为什么新的扫描仪正在读取并且不接受任何输入。
public static void favNumber(){
Scanner scanner = new Scanner(System.in);
System.out.println("Enter you favorite number: ");
int favNumber = 0;
boolean hasNextInt = scanner.hasNextInt();
if(hasNextInt){
favNumber = scanner.nextInt();
scanner.nextLine(); //reads enter character
}
System.out.println("Your favorite number is: " + favNumber);
scanner.close();
}
您的 Scanner
实例包装 System.in
(stdin)。当您在方法结束时调用 scanner.close()
时,除了扫描仪之外,您实际上还关闭了 System.in
。一旦输入流关闭,就不能再打开了。
解决方案当然是共享扫描程序的单个实例。我注意到您使用的是静态方法,因此我将在以下示例中同样使用静态实例。请注意我是如何创建扫描器的,然后调用 favNumber()
,并且仅在完成调用 favNumber()
后才关闭扫描器。这允许我多次调用 favNumber()
并共享同一个扫描器实例。
private static Scanner scanner; // note that this is a class-level static variable.
public static void main(String[] args) throws Exception {
try {
scanner = new Scanner(System.in); // create the scanner
favNumber(); // call the method
} finally {
scanner.close(); // only close the scanner when we're completely done
}
}
public static void favNumber(){
System.out.println("Enter you favorite number: ");
int favNumber = 0;
boolean hasNextInt = scanner.hasNextInt();
if(hasNextInt){
favNumber = scanner.nextInt();
scanner.nextLine(); //reads enter character
}
System.out.println("Your favorite number is: " + favNumber);
}
另一种解决方案是将扫描器实例作为方法参数传递,如下所示:
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in); // create the scanner
favNumber(scanner); // call the method, pass the scanner
scanner.close(); // only close the scanner when we're completely done
}
public static void favNumber(Scanner scanner){
System.out.println("Enter you favorite number: ");
int favNumber = 0;
boolean hasNextInt = scanner.hasNextInt();
if(hasNextInt){
favNumber = scanner.nextInt();
scanner.nextLine(); //reads enter character
}
System.out.println("Your favorite number is: " + favNumber);
}
您可以在此处的此问答中阅读有关关闭扫描仪包装 System.in 的更多信息:Close a Scanner linked to System.in