调用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; } }