2012-09-02 45 views
2

我正在制作密码生成器和管理器。我通过从for循环中一次生成一个字符来创建密码。在每次for循环迭代结束时,它会打印出所选的随机字符。我一直试图通过char将密码char存储到与for循环中的i值相关的数组的索引中。这不仅仅是印刷和我无法做任何事情。因此,我有两个问题,我的主要问题是:是否可以捕获我打印的字符,然后将它们存储在字符串中?或者,像下面的代码一样,我是否可以避免运行时(通过我的数组)运行时出现的空指针异常?空指针异常发生时,我试图分配一个字符串到我的密码字符串在索引我。这可能会更好地解释我的代码。 感谢您的帮助:)将数据从System.out.print方法存储到字符串(Java)中?

package pass.gen; 


public class PassGen { 


    public static void main(String[] args) { 
     PassGen passGen = new PassGen(); 
     passGen.generate(); 
    } 

    String lAlpha = "abcdefghijklmnopqrstuvwxyz"; //used to generate lowercase pass chars 
    String uAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //used to generate uppercase pass chars 
    int minNum = 0; //the mininum number that a integer value can be in the password 
    int maxNum = 9; //the max number "" ..........................................."" 
    int randomNumber; 
    int minString = 0; 
    int maxString = 25; 
    int randomLNum; 
    int randomUNum; 
    int low1 = 1; 
    int high3 = 3; 
    int ran3; 
    char randomLChar; 
    char randomUChar; 
    char randomNumChar; 
    String randomLString; 
    String randomUString; 
    String randomNumString; 
    String passString []; //should this be an array of chars? 
    boolean case1; //if the case is true (case1 is for random numbers) then a random number is added to the passString 
    boolean case2; //if the case is true (case2 is for random lowercase letters) then a random lowercase letter is added to the passString 
    boolean case3; //if the case is true (case3 is for random uppercase letters) then a random uppercase letter is added to the passString 

    void generate(){ 
     for(int i = 0; i < 4; i++){ 
      ran3 = low1 + (int)(Math.random() * ((high3 - low1) + 1)); 
      switch(ran3){ 
      case 1:genNumber(0,9); 
      break; 
      case 2:genLAlpha(); 
      break; 
      case 3:genUAlpha(); 
      break; 
      default:System.out.println("Unable to Generate a Password."); 
      } 
      if(case1 == true){ 
       passString[i] = randomNumString; 

      }if(case2 == true){ 
       passString[i] = randomLString; 

      }if(case3 == true){ 
       passString[i] = randomUString; 
      } 
     } 
     System.out.println(passString); 
    } 

    void genNumber(int min, int max){ 
     randomNumber = min + (int)(Math.random() * ((max - min) + 1)); 
     randomNumChar = Character.forDigit(randomNumber,5); 
     case1 = true; 
    } 

    void genLAlpha(){ 
     randomLNum = minString + (int)(Math.random() * ((maxString - minString) + 1)); 
     randomLChar = lAlpha.charAt(randomLNum); 
     randomLString = Character.toString(randomLChar); 
     case2 = true; 
    } 

    void genUAlpha(){ 
     randomUNum = minString + (int)(Math.random() * ((maxString - minString) + 1)); 
     randomUChar = uAlpha.charAt(randomUNum); 
     randomUString = Character.toString(randomUChar); 
     case3 = true; 
    } 


} 
+0

我还不确定你为什么要这样做。为什么不保存一个String或StringBuilder? –

+0

还有什么行导致NPE被抛出? –

+2

您的代码有几个问题可以改进。也许你应该考虑在http://codereview.stackexchange.com/上提问,但作为@HovercraftFullOfEels说,你应该看看使用[StringBuilder](http://docs.oracle.com/javase/1.5.0 /docs/api/java/lang/StringBuilder.html)。 –

回答

1
  • passString未初始化,您NullPointerException
  • genNumber的,因此造成不设置的randomNumString的价值,因此,它永远是空

你的“生成”方法应该返回它们生成的值。这将消除对成员变量的依赖,减少可能出现问题的区域数量。这也意味着您可以添加新一代方法而无需更改大量代码...

即使您选择不这样做,您应该有一个保存每个计算结果的变量。 。

试试这个...

public class PassGen { 

    public static void main(String[] args) { 
     PassGen passGen = new PassGen(); 

     String generate = passGen.generate(); 
     System.out.println(generate); 

    } 
    String lAlpha = "abcdefghijklmnopqrstuvwxyz"; //used to generate lowercase pass chars 
    String uAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //used to generate uppercase pass chars 
    int minNum = 0; //the mininum number that a integer value can be in the password 
    int maxNum = 9; //the max number "" ..........................................."" 
    int minString = 0; 
    int maxString = 25; 
    int low1 = 1; 
    int high3 = 3; 

    public String generate() { 
     StringBuilder sb = new StringBuilder(4); 

     for (int i = 0; i < 4; i++) { 
      sb.append(generateCharacter()); 
     } 
     return sb.toString(); 
    } 

    protected char generateCharacter() { 
     char result = '-'; 
     int ran3 = low1 + (int) (Math.random() * ((high3 - low1))); 
     switch (ran3) { 
      case 0: 
       result = genNumber(0, 9); 
       break; 
      case 1: 
       result = genLAlpha(); 
       break; 
      case 2: 
       result = genUAlpha(); 
       break; 
     } 

     return result; 

    } 

    protected char genNumber(int min, int max) { 
     int randomNumber = min + (int) (Math.random() * ((max - min) + 1)); 
     char randomNumChar = Character.forDigit(randomNumber, 5); 
     return randomNumChar; 
    } 

    protected char genLAlpha() { 
     int randomLNum = minString + (int) (Math.random() * ((maxString - minString) + 1)); 
     char randomLChar = lAlpha.charAt(randomLNum); 
     return randomLChar; 
    } 

    protected char genUAlpha() { 
     int randomUNum = minString + (int) (Math.random() * ((maxString - minString) + 1)); 
     char randomUChar = uAlpha.charAt(randomUNum); 
     return randomUChar; 
    } 
} 

另外,我强烈建议你做一些时间来学习如何使用IDE的调试器。如果你不使用IDE,我强烈建议你开始。我花了30秒来添加一个中断点,并找到你的NullPointerException

+0

这很奇怪,我使用eclipse的调试器来查找我的空指针异常,事情是它出现在不同的行上,因为它选择了一个随机的情况。当我测试时,调试器为我工作得很好:)关于初始化数组,我怎么能初始化它在我的for循环外,同时仍然定义它作为我的大小? (或等同物)。我也会看看StringBuilder,谢谢:) – tgmars

+0

你应该初始化数组到外部的循环,它应该被初始化为期望的元素数(在这个例子中是4,因为这就是你循环使用的) – MadProgrammer

+0

谢谢,StringBuilder和示例代码工作:)我现在看到它的使用。唯一的问题似乎是在stringbuilder中没有随机数字出现。 – tgmars

相关问题