2015-06-22 44 views
0

我通过控制台工作的一个银行程序无限循环。我想在用户输入密码时隐藏密码。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块并且结果是无限循环。

+1

@AhsN内,他为什么要这么做?它将作为循环中的第一个语句执行。 – Seelenvirtuose

+1

@SpecialK也许你的方法'User.checkPassword(String)'总是返回'false'?另外,如果你没有控制台会发生什么?你将不会有机会输入任何东西,但是你的'readPass'方法只是返回一个空字符串(总是)。也许这是你的无限循环? – Seelenvirtuose

+0

你确定checkPassword正常吗? – zubergu

回答

1

如果您的控制台为空,则会发生无限循环。在eclipse中有一个bug,它导致System.console的npe。

尝试使用扫描仪进行测试代码。

请阅读本explanation

From console java doc 无论是虚拟机具有控制台取决于底层平台,也取决于在其中虚拟机被调用的方式。如果虚拟机从一个交互式命令行开始,而不需要重新定向标准输入和输出流,那么其控制台将存在并且通常将被连接到从所述虚拟机发起的键盘和显示器。如果虚拟机是自动启动的,例如通过后台作业调度程序,那么它通常没有控制台。

此外,而不是反复concatinating字符,可以字符数组转换成字符串作为pass = new String(pword)

如果你想从IDE进行测试,请尝试使用扫描仪(密码将是可见的,打字时),或者你可以创建一个小JDialog和嵌入JPasswordField

+0

只有当OP没有从命令提示符运行时,情况就是这样。但是如果他从命令提示符运行,那么可能是什么原因? – Blip

+0

我正在使用eclipse及其控制台,并且以前一切正常,当我使用扫描仪时,除了密码未被隐藏。如果我无法使用System.console,如何隐藏密码? –

+0

这是绝对的问题,因为我在调试后意识到,但是什么是等效的解决方法? –