调用Scanner.close()会抛出nosuchelementexception

我有一个简单的方法,它将命令打印到屏幕,扫描用户的输入,并将其作为字符串返回。 如果用户的输入无效,它会通知用户并再次询问。 这个方法工作得很好,但我的讲师提到我们应该总是关闭资源,所以我回去并在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; } } 

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

当您关闭scan您正在关闭System.in ,当您尝试重新读取它时,它将抛出exception。

您的教师在一个方面是正确的,您应该清理资源, 而不是在涉及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; } }