2010-10-06 3 views
0

Я разработал следующее приложение, в котором мне нужно было скрыть ПИН-код и завершить работу программы после того, как пользователь ввел неправильный 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  
} 

ответ

2

В java.io.Console используется метод readPassword(). Зачем вам нужен отдельный поток? Это делает все слишком сложным.

Что касается вашего вопроса, почему это не близко: Java может оптимизировать while(isTrue){} что-то вроде if(isTrue) { while(true) { } }, если вы не установите isTruevolatile или синхронизировать доступ к isTrue (геттер/сеттер). Эта оптимизация называется подъемом и объясняется в Effective Java SE, п. 66.

Вот статья, в которой объясняется именно ваша проблема: эхо * вместо пробелов. http://java.sun.com/developer/technicalArticles/Security/pwordmask/ Они идут сложным способом, но это работает. Я предпочел бы пробелы над звездочками, поскольку это более простой способ. Не эхо * это * nix standard afaik.

+0

На самом деле я использовал метод readPassword, но он помещал символы в пробел, но мне нужно, чтобы он отображал общий символ. Вот почему я использовал эту технику – Yoosuf

+0

Все решение слишком сложно. –

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 
Смежные вопросы