Java io句柄是无效的异常

时间:2012-06-08 21:09:54

标签: java io bufferedreader

我有一个使用readPassword()从控制台读取的函数。在一次程序迭代中多次调用此函数。但是,一旦到达readPassword()行,我就会得到一个java io异常。我注意到当我从finally子句中删除close()语句时,此错误消失了。为什么会发生这种情况?何时应该正确关闭读卡器?

public void Func()
{
        Console console = System.console();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        if (console == null)
            System.out.println("Error!");

        try 
        {
           char[] pwd = console.readPassword();
           String password = new String(pwd);
           System.out.println("PW: " + password);

           String input = reader.readLine();
           System.out.println("UserNm: " + input);
        } catch (IOException e) {
            System.out.println("IO EXCEPTION");
        } finally {
            if (reader != null)
            {
                try
                {
                    reader.close();
                }
                catch (IOException e)
                {
                    System.out.println("error");
                }
            }
        }
        return null;
}

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

只有一个控制台,而且只有一个System.in。如果你关闭它,那么你就不能再读它了!您不需要关闭BufferedReader,也不需要关闭finally。整个BufferedReader块可以而且应该消失。

仔细阅读后,我甚至不知道为什么你首先创建 {{1}} - 它似乎没有任何功能。只需删除处理它的所有代码!

答案 1 :(得分:3)

此处不需要任何阅读器,只需使用Console实例。

public String Func() {
        Console console = System.console();
        if (console == null)
            throw new IllegalStateException("No console available");

        try {
           String username = console.readLine("Username: ");
           String pwd = new String(console.readPassword("Password: "));
           return pwd;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
}

编辑您的问题编辑。只需使用Console类,它就可以读/写,不需要任何读写器。

答案 2 :(得分:1)

您不应该关闭Console。保持打开,直到你的程序不再需要从中读取它。

答案 3 :(得分:1)

使用像java.util.Scanner这样的东西,而其他人说不要担心会关闭system.in。

更清洁:

Scanner in = new Scanner(System.in);
String password  = in.nextLine(); 
String username  = in.nextLine();

不需要整理/处理异常。