调用 Scanner.close() 会抛出 nosuchelement 异常

Rya*_*ers 4 java exception java.util.scanner

我有一个简单的方法,可以将命令打印到屏幕上,扫描用户的输入,并将其作为字符串返回。如果用户的输入无效,它会通知用户并再次询问。此方法运行良好,但我的导师提到我们应该始终关闭资源,因此我返回并添加了 close 方法,现在每次调用该方法时,无论用户输入如何,我都会收到 NoSuchElementException。这是代码...

private String getUserString(String userCommand) {
    System.out.println(userCommand);
    Scanner scan = new Scanner(System.in);
    String userinput = scan.nextLine().trim();

    if (userinput.isEmpty()){
        System.out.println("Invalid choice");
        return getUserString(userCommand);
    }

    else {
        return userinput;
    }
}
Run Code Online (Sandbox Code Playgroud)

异常总是指向用户输入作为 scan.nextLine().trim() 启动的行 注意* 我在每个 return 语句之前的每行上添加了 scan.close() ,但是我没有在上面包含它。

dac*_*cwe 5

当你关闭时,scan你正在关闭System.in,当你尝试重新读取它时,它会抛出异常。

你的导师在一方面是对的,你应该清理资源,但不是在涉及到的时候System.in


Scanner您可以创建一次并在需要输入的地方重新使用它,而不是每次需要输入时都重新打开流:

public static void main(String[] args) throws IOException {
    Scanner scan = new Scanner(System.in);
    System.out.println(getUserString("Write something:", scan));
    System.out.println(getUserString("Write something else:", scan));
}

private static String getUserString(String userCommand, Scanner scan) {

    System.out.println(userCommand);

    String userinput = scan.nextLine().trim();

    if (userinput.isEmpty()) {
        System.out.println("Invalid choice");
        return getUserString(userCommand, scan);
    } else {
        return userinput;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 那么在这种情况下我应该简单地抑制警告而不是关闭我的扫描仪吗?在我尝试调用 close 之前,该代码运行良好。 (2认同)