我开发了以下应用程序,其中我需要屏蔽PIN并在用户输入错误的PIN三次后终止程序。但是,只有当我在开头关闭stopThread时程序终止(我在下面的代码中对它进行了评论),但是当我这样做时,所有三个通道都不会出现密码屏蔽。但是,当我在显示登录成功屏幕之前关闭stopThread时,程序不会终止。我需要使用ctrl + c来结束程序。
非常感谢任何帮助。
boolean stopThread = false;
boolean hideInput = false;
boolean shortMomentGone = false;
public static double userBal=0.0D;
public void run(){
try{
sleep(500);
} catch(InterruptedException e){
}
shortMomentGone = true;
while(!stopThread){
if(hideInput){
System.out.print("\b*");
}
try{
sleep(1);
} catch(InterruptedException e){
}
}
}
public static final int NB_OF_TRIES = 3;
public void validatePin(){
BankAccount getAll=new BankAccount();
String pin="";
getAll.Login();
Login hideThread =new Login();
hideThread.start();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try{
do{
} while(hideThread.shortMomentGone == false );
// Now the hide thread should begin to overwrite any input with "*"
hideThread.hideInput = true; // Read the PIN
System.out.println("\nPIN:");
boolean pinMatch = false;
int i = 0;
while(!pinMatch && i < NB_OF_TRIES) {
hideThread.hideInput = true;
pin = in.readLine();
i++;
//hideThread.stopThread = true; //Program terminates after third attempt
//PIN masking is stopped, if uncommented
System.out.print("\b \b");
if(pin.equals(" ")){
System.out.println("Please do not leave unnecessary spaces!");
getAll.Login();
}else if(pin.equals("")){
System.out.println("Please do not press the enter key without entering the PIN!");
getAll.Login();
}
FileInputStream fileinputstream = new FileInputStream(".\\AccountInfo.txt");
DataInputStream datainputstream = new DataInputStream(fileinputstream);
BufferedReader bufferedreader1 = new BufferedReader(new InputStreamReader(datainputstream));
do
{
String s1;
if((s1 = bufferedreader1.readLine()) == null)
{
break;
}
if(s1.trim().charAt(0) != '#')
{
String as[] = s1.split(" ");
if(pin.equals(as[0]))
{
System.out.println("You have login!");
String s2 = as[2];
userBal = Double.parseDouble(s2);
getAll.balance = userBal;
hideThread.stopThread = true;
getAll.MainMenu();
System.exit(0);
}else if(pin != as[0]){
System.out.println("Invalid PIN!");
getAll.Login();
System.out.println("\n NOTE :- You are only allowed to enter the PIN THREE times. The number of tries remaining before your card is blacklisted are "+i + "\n Please re-enter your PIN");
}
}
} while(true);
datainputstream.close();
}//End of While Loop
}catch(Exception exception)
{
System.err.println((new StringBuilder()).append("Error: ").append(exception.getMessage()).toString());
}//End of try-catch block
}
答案 0 :(得分:2)
java.io.Console中有一个readPassword()方法,使用它。为什么你需要一个单独的线程?这使得一切都太复杂了。
关于您的问题,为什么不关闭:如果您未设置while(isTrue){}
if(isTrue) { while(true) { } }
或同步对isTrue的访问权限,Java可能会将isTrue
优化为volatile
之类的内容(的getter / setter)。这种优化称为提升,并在Effective Java SE第66项中进行了解释。
这篇文章准确地解释了你的问题:回声*而不是空白。 http://java.sun.com/developer/technicalArticles/Security/pwordmask/ 他们也是复杂的方式,但它的工作原理。我更喜欢空白而不是星号,因为这是更容易的方法。不回应*是* nix标准afaik。
答案 1 :(得分:0)
实际上在我分析了它之后,我意识到系统不会终止的原因是因为它没有保存在适当的位置。因此,解决方案是在while循环关闭后立即结束程序,然后一切都能正常工作。
} while(true);
datainputstream.close();
}//End of While Loop
System.exit(0); // After the system is closed the program would terminate after the third attempt
}catch(Exception exception)
{
System.err.println((new StringBuilder()).append("Error: ").append(exception.getMessage()).toString());
}//End of try-catch block