2012-09-02 61 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

相關問題