我有一个使用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;
}
提前感谢您的帮助!
答案 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();
不需要整理/处理异常。