为什么扫码器读取没有输入和退出功能?

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