2009-11-20 4 views
0

J'ai deux classes: une classe Generator et une classe SystemManagement. La classe Generator, je peux générer un mot de passe. La classe SystemManagement importe Generator (à partir d'un autre package) et inclut des informations supplémentaires.Pourquoi ma méthode retourne un mot de passe nul?

Lorsque je crée un objet SystemManagement et que j'appelle le getPassword(), je récupère null. Pourquoi cela arrive-t-il?

Générateur:

public class Generator { 

    private static String password; 
    private static Generator instance; 

    public String nextPassword() { 
     char[] allowedCharacters = {'a', 'b', 'c', 'd', 'e', 'f', '1', '2', '3', '4', '5','6'}; 

     SecureRandom random = new SecureRandom(); 
     StringBuffer password1 = new StringBuffer(); 
     for (int i = 0; i < password1.length(); i++) { 
      password1.append(allowedCharacters[random.nextInt(allowedCharacters.length)]); 
     } 
     password = password1.toString(); 
     return password; 


    } 

    public String currentPassword() { 
     return password; 
    } 

    public static void setPassword(String password) { 
     Generator.password = password; 
    } 

    public static Generator getInstance() { 
     if (instance == null) { 
      instance = new Generator(); 
     } 
     return instance; 
    } 
} 

Systemmanagement:

public class SystemManagement implements Serializable { 
    private String name; 
    private String family; 
    private String password; 

    public SystemManagement() { 

    } 

    public SystemManagement(String password) { 
     this.password = Generator.getInstance().nextPassword(); 
    } 

    public Students addStudent(String name, String family) { 
     Students student = new Students(name, family); 
     students.add(student); 
     return student; 

    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 
+2

Dupe: http://stackoverflow.com/questions/1769962/why-am-i-getting-null-on-this-code – BalusC

+0

Comment est-ce connecté à findbugs? –

Répondre

0

password1.length() est 0 première fois, il ne se remplit?

+0

Cela retournerait une chaîne vide, pas null. – erickson

0
StringBuffer password1 = new StringBuffer(); 
    for (int i = 0; i < password1.length(); i++) { 

Je suppose que ce serait 0 pour la length du tampon de chaîne.

0

Si vous appelez le constructeur sans argument (comme sys = new SystemManagement();), le nouveau membre de l'objet password est jamais définie. Cela ne se produit que si vous appelez le constructeur qui prend un String — que vous ignorez.

0
StringBuffer password1 = new StringBuffer(); 
for (int i = 0; i < password1.length(); i++) { 
    password1.append(allowedCharacters[random.nextInt(allowedCharacters.length)]); 
} 

La boucle ne sera jamais fonctionner comme password1.length() sera de 0 à ce moment.

3

Je peux repérer quelques problèmes avec votre code:

  • Votre méthode nextPassword() retourne toujours un vide String comme mot de passe parce que vous itérer sur une StringBuilder vide avec la longueur 0.

  • Lorsque vous créez un nouvel objet SystemManagement avec le constructeur sans paramètre, votre password est null car vous ne lui attribuez rien (sauf si vous utilisez le setter setPassword).

  • Lorsque vous créez un nouvel objet SystemManagement avec le constructeur qui prend un String, vous ignorez le paramètre et votre password est vide parce que nextPassword() retourne toujours un String vide.

Questions connexes