调用Scanner.close()会抛出nosuchelementexception

时间:2012-09-17 07:16:35

标签: 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;
    }
}

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

1 个答案:

答案 0 :(得分:4)

当您关闭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;
    }
}