2009-11-20 4 views
0

У меня есть два класса: класс генератора и класс SystemManagement. Класс Generator, я могу сгенерировать пароль. Класс SystemManagement импортирует генератор (из другого пакета) и содержит дополнительную информацию.Почему мой метод возвращает пустой пароль?

Когда я создаю объект SystemManagement и звоню getPassword() на нем, я возвращаюсь null. Почему это происходит?

Генератор:

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

Как это подключен к FindBugs? –

ответ

0

password1.length() 0 первый раз, так что он никогда не заполняется?

+0

Это вернет пустую строку, а не null. – erickson

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

Я бы предположил, что это было бы 0 для length строкового буфера.

0

Если вы вызываете конструктор без аргументов (например, sys = new SystemManagement();), участник password нового объекта никогда не будет установлен. Это происходит только при вызове конструктора, который принимает String —, который вы игнорируете.

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

Цикл for никогда не будет работать, поскольку password1.length() будет 0 в настоящее время.

3

я могу определить несколько проблем с кодом:

  • nextPassword() Ваш метод всегда возвращает пустой String в качестве пароля, потому что вы итерацию над пустой StringBuilder с длиной 0.

  • Когда вы создаете новый объект SystemManagement с конструктором без параметров, ваш password имеет значение null, потому что вы ничего ему не присваиваете (если вы не используете установщик setPassword).

  • При создании нового объекта SystemManagement с конструктором, который принимает String, вы игнорируете параметр и ваш password пуст, потому что nextPassword() всегда возвращает пустой String.

Смежные вопросы