2010-10-06 4 views
0

J'ai développé l'application suivante dans laquelle je devais masquer le code PIN et terminer le programme après que l'utilisateur ait saisi le mauvais code PIN trois fois. Cependant, le programme se termine seulement si je ferme le stopThread au début (je l'ai commenté dans le code ci-dessous), cependant le masquage du mot de passe ne se produit pas pour tous les trois channces quand je le fais. Mais, quand je ferme le stopThread juste avant d'afficher l'écran de connexion réussie, le programme ne se termine pas. J'ai besoin d'utiliser ctrl + c pour terminer le programme.Le masquage du mot de passe ne termine pas le programme si nécessaire

Toute aide est grandement appréciée.

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  
} 

Répondre

2

Il existe une méthode readPassword() dans java.io.Console, utilisez-la. Pourquoi avez-vous besoin d'un thread séparé du tout? Cela rend tout trop compliqué.

En ce qui concerne votre question pourquoi cela ne se ferme pas: Java peut optimiser while(isTrue){} à quelque chose comme if(isTrue) { while(true) { } } si vous ne définissez pas isTruevolatile ou synchronisez l'accès à isTrue (getter/setter). Cette optimisation est appelée hissage et expliquée dans Effective Java SE, item 66.

Voici un article qui explique exactement votre problème: écho * à la place des blancs. http://java.sun.com/developer/technicalArticles/Security/pwordmask/ Ils vont de la manière compliquée, aussi, mais cela fonctionne. Je préférerais les blancs sur les astérisques puisque c'est le moyen le plus facile d'y aller. Pas d'écho * est * nix standard afaik.

+0

En fait, j'ai utilisé la méthode readPassword, mais elle a substitué les caractères avec un espace vide, mais j'en ai besoin pour montrer un symbole commun. C'est la raison pour laquelle j'ai utilisé cette technique – Yoosuf

+0

L'ensemble de la solution est beaucoup trop compliqué. –

0

En fait, après que je l'ai analysé, j'ai réalisé que la raison pour laquelle le système ne se termine pas est parce qu'il n'est pas conservé à l'endroit approprié. Par conséquent, la solution serait de terminer le programme dès que la boucle while est fermée et que tout fonctionne correctement.

 } 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 
Questions connexes