Console.readPassword() 在 java 中创建无限循环



我正在通过控制台开发银行程序。我想在用户输入密码时隐藏密码。

我创建了自己的方法,该方法读取密码并使用控制台类中的 readPassword() 方法返回字符串:

/**
 * Reads Password without allowing the console to show the characters 
    while the user is typing the password.
 * @return
 */
public String readPass(){
    String pass = "";
    Console cnsl = System.console();
    if(cnsl!=null){
        char[] pword = cnsl.readPassword();
        for(char c: pword){
            pass+=c;
        }
        return pass;
    }
    return "";
}

该方法从另一个类调用:

/**
 * Asks the user to enter their password. Then checks if the password is right.
 * @param u
 */
public void checkPassword(User u){
    boolean pa = false;
    do{
        System.out.print("Please enter your password: ");
        //String pword = in.next();
        String pword = b.readPass();
        pa = u.checkPassword(pword);
        if(pa){
            System.out.println("nLogin Successful...");
            System.out.println("nWelcome "+ u.getName() + "!");
            enterAccount(u);
        }
        else{
            System.out.println("That is the incorrect password. Please try again.n");
        }
    }while(!pa);
}

提示密码的那一刻,else块被执行,结果是一个无限循环。

如果主机为 null,则可能会发生无限循环。eclipse 中有一个错误,它会导致 System.console 的 npe。

尝试使用扫描程序测试代码。

请阅读此说明

从控制台 java 文档虚拟机是否具有控制台取决于底层平台以及调用虚拟机的方式。如果虚拟机从交互式命令行启动而不重定向标准输入和输出流,则其控制台将存在,并且通常会连接到启动虚拟机的键盘和显示器。如果虚拟机自动启动(例如由后台作业计划程序启动),则它通常没有控制台。

此外,您可以按照pass = new String(pword)将字符数组转换为字符串,而不是重复连接字符。

如果要从 IDE 进行测试,请尝试使用 scanner(键入时密码将可见),或者您可以创建一个小JDialog并在其中嵌入一个 JPasswordField

相关内容

  • 没有找到相关文章

最新更新