0

readPassword()を使用してコンソールから読み取る関数があります。この関数は、1回のプログラム反復で数回呼び出されます。ただし、readPassword()行に到達すると、javaio例外が発生し続けます。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

4 に答える 4

4

コンソールは1つだけで、1つだけSystem.inです。閉じてしまうともう読めなくなります!あなたはそれを閉じる必要はありませんしBufferedReader、あなたもそうすべきではありません。そのブロック全体がfinallyなくなる可能性があり、なくなるはずです。

よく読んでみると、そもそもなぜ作成しているのかわかりませんBufferedReader。機能がないようです。それを扱うすべてのコードを削除するだけです!

于 2012-06-08T21:14:11.227 に答える
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クラスを使用するだけで、読み取り/書き込みが可能で、リーダー/ライターは必要ありません。

于 2012-06-08T21:17:22.737 に答える
1

を閉じないでくださいConsole。プログラムから読み取る必要がなくなるまで、開いたままにします。

于 2012-06-08T21:16:56.347 に答える
1

代わりにjava.util.Scannerのようなものを使用してください。他の人が言うように、system.inを閉じようとすることを心配する必要はありません。

とてもきれい:

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

片付け/例外処理は必要ありません。

于 2012-06-08T21:21:02.023 に答える