2009-11-20 69 views
0

我有两个类:一个Generator类和一个SystemManagement类。发生器类,我可以生成密码。 SystemManagement类导入Generator(来自另一个包)并包含附加信息。为什么我的方法返回空密码?

当我制作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

杜佩:http://stackoverflow.com/questions/1769962/why-am-i-getting-null-on-this-code – BalusC 2009-11-20 14:56:01

+0

这是怎么连接到FindBugs的? – 2009-11-20 20:51:24

回答

0

password1.length()0是第一次,所以它从来没有得到填补?

+0

这将返回一个空字符串,而不是null。 – erickson 2009-11-20 14:57:42

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

我能发现一对夫妇的问题与您的代码:

  • 因为你遍历一个空StringBuilder长度为你nextPassword()方法总是返回一个空String作为密码0

  • 当使用无参数构造函数创建一个新的SystemManagement对象,则password为空,因为您不指定任何对象(除非使用setPassword设置器)。

  • 当您创建与需要String构造一个新的SystemManagement对象,你忽略参数,并且您password是空的,因为nextPassword()总是返回一个空String

相关问题