2017-09-14 36 views
0

這裏是Java Starter,因此我的密碼生成程序 因此,我嘗試創建一個選項來生成多個密碼,並在它們之間留有空格。java;在將文本設置爲字符串時繼續獲取java.lang.String

例子: PASSWORD1

密碼2

但是,當我設置的「密碼」文本到文本字段我不斷收到這樣的東西:ADWADjava.lang.StringQE_Q12

我沒找到在我的代碼中的任何錯誤,或者導致java.lang.String彈出的東西,如果你知道什麼是錯的,請回復這個問題或者發送一個答案。

我的代碼:

createPass.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       field.setText(null); 
       field.setText(""); 
       String[] pass = new String[5]; 
       for(int i = 0; i < pass.length ; i++) { 
        pass[i] = allrandom(); 


       } 
       for(int i = 0; i < pass.length ; i++) { 
        field.setText(field.getText() + pass[i]); 
       } 


      }}); 



} 
    public static String allrandom() { 
     String cpass = ""; 
     password = ""; 
     String[] pass = new String[15]; 
     Random r = new Random(); 
    for(int i = 0 ; i < pass.length ; i++) { 
     int ch = 0; 
     ch = r.nextInt(3); 
     switch(ch) { 
     case 0: 
      if(passsettings.isIfDots()) { 
       String newchar = ""; 
       newchar = dotpass(); 
       pass[i] = newchar; 
       break; 
      } 
     case 1: 
      if(passsettings.isIfNum()) { 
       String newchar2 = ""; 
       newchar2 = Numpass(); 
       pass[i] = newchar2; 
       break; 
      } 
     case 2: 

      String newchar3 = ""; 
      newchar3 = charchose(); 
      pass[i] = newchar3; 
      break; 
     } 

    } 
    for(int i = 0 ; i < pass.length ; i++) { 
     String newpasschar = ""; 
     newpasschar = pass[i]; 
     cpass = pass + newpasschar; 
    } 
    cpass = cpass + "\n"; 
    return cpass; 


     // random() end 
    } 


    public static String uppercasepass() { 
     String[] abc = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}; 
     Random r = new Random(); 
     String passletter = ""; 
     int rN3 = 0; 
     rN3 = r.nextInt(26); 
     passletter = abc[rN3]; 



     return passletter; 
    // uppercase() end 
} 

    public static String lowercasepass() { 
     Random r = new Random(); 
     String passletter = ""; 
     int rN3 = 0; 
     rN3 = r.nextInt(26); 
     String[] abc = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 
     passletter = abc[rN3]; 
     return passletter; 
    } 

    public static String Numpass() { 
     Random r = new Random(); 
     String passletter = ""; 
     int rN = 0; 
     rN = r.nextInt(9); 
     String[] nums = {"1","2","3","4","5","6","7","8","9"}; 
     passletter = nums[rN]; 
     return passletter; 
    } 

    public static String dotpass() { 
     Random r = new Random(); 
     String passletter = ""; 
     int rN5 = 0; 
     rN5 = r.nextInt(6); 
     String[] dots = {"_","]","$","#","=","@"}; 
     passletter = dots[rN5]; 




     return passletter; 
    } 


    public static String charchose() { 
     Random r = new Random(); 
     String line = ""; 
     int rN = 0; 
     rN = r.nextInt(2); 
     String[] random = {"Low","Up"}; 
     String random2 = random[rN]; 
     switch(random2) { 
     case "Low": 
      if(passsettings.isIfLowercase()) { 
       line = lowercasepass(); 
      }else { 
       charchose(); 
      } 
     case "Up": 
      if(passsettings.isIfUpprcase()) { 
       line = uppercasepass(); 
      }else { 
       charchose(); 
      } 
     } 










     return line; 
    } 

感謝,

  • 的Java入門
+0

注:我做了系統的嘗試.out.println和一切正常工作。 –

+0

'field.getText()。toString()' –

+0

@JavaStarter精確這個。如果你測試了一些方法(例如使用sysout),你應該看看錯誤來自哪裏。在你的情況下,這是在'setText'的權利? – Nathan

回答

1

當調試代碼,我有問題有(很多東西,但主要).. 。

public static String allrandom() { 
    String cpass = ""; 
    password = ""; 
    String[] pass = new String[15]; 
    //... 
    for (int i = 0; i < pass.length; i++) { 
     String newpasschar = ""; 
     newpasschar = pass[i]; 
     cpass = pass + newpasschar; 
    } 
    cpass = cpass + "\n"; 
    return cpass; 

    // random() end 
} 

pass + newpasschar正試圖連接一個數組和一個String對象。這跟做pass.toString() + newpasschar.toString()

基本一樣爲什麼你這樣做,我不知道cpass += newpasschar會達到你要找的結果。

我真的不想去通過所有你能,並指出所有的問題,但是我們要說...瞭解如何使用StringBuilder - 它的方式更有效

整件事只是尖叫定製類我,特別是在使用生成器模式,例如...

public class PasswordBuilder { 

    private List<String> characters; 
    private List<String> numbers; 
    private List<String> dots; 

    private boolean useDots = true; 
    private boolean useNumbers = true; 
    private boolean useLowerCase = true; 
    private boolean useUpperCase = true; 

    private int length; 

    public PasswordBuilder(int length) { 
     this.length = length; 
    } 

    public PasswordBuilder useDots(boolean use) { 
     useDots = use; 
     return this; 
    } 

    public PasswordBuilder useNumbers(boolean use) { 
     useNumbers = use; 
     return this; 
    } 

    public PasswordBuilder userLowerCase(boolean use) { 
     useLowerCase = use; 
     return this; 
    } 

    public PasswordBuilder useUpperCase(boolean use) { 
     useUpperCase = use; 
     return this; 
    } 

    protected int getLength() { 
     return length; 
    } 

    protected boolean isUsingDots() { 
     return useDots; 
    } 

    protected boolean isUsingNumbers() { 
     return useNumbers; 
    } 

    protected boolean isUsingLowerCase() { 
     return useLowerCase; 
    } 

    protected boolean isUsingUpperCase() { 
     return useUpperCase; 
    } 

    public String build() { 
     characters = new ArrayList<>(Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")); 
     numbers = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9")); 
     dots = new ArrayList<>(Arrays.asList("_", "]", "$", "#", "=", "@")); 

     Random r = new Random(); 
     StringBuilder sb = new StringBuilder(getLength()); 
     for (int i = 0; sb.length() < getLength(); i++) { 
      switch (r.nextInt(3)) { 
       case 0: 
        if (isUsingDots()) { 
         sb.append(dotpass()); 
         break; 
        } 
       case 1: 
        if (isUsingNumbers()) { 
         sb.append(Numpass()); 
         break; 
        } 
       case 2: 
        sb.append(charchose()); 
        break; 
      } 
     } 
     return sb.toString(); 
    } 

    protected String randomFrom(List<String> values) { 
     Collections.shuffle(values); 
     return values.get(0); 
    } 

    protected String uppercasepass() { 
     return randomFrom(characters).toLowerCase(); 
    } 

    protected String lowercasepass() { 
     return randomFrom(characters).toLowerCase(); 
    } 

    protected String Numpass() { 
     return randomFrom(numbers); 
    } 

    public String dotpass() { 
     return randomFrom(dots); 
    } 

    protected String charchose() { 
     Random r = new Random(); 
     int value = r.nextInt(2); 
     String text = ""; 
     switch (value) { 
      case 0: 
       text = lowercasepass(); 
      case 1: 
       text = uppercasepass(); 
     } 
     return text; 
    } 

} 

這意味着你可以簡單地做這樣的事情......

System.out.println(new PasswordBuilder(15).build()); 
System.out.println(new PasswordBuilder(15).useNumbers(false).build()); 
System.out.println(new PasswordBuilder(15).userLowerCase(false).build()); 
System.out.println(new PasswordBuilder(15).userLowerCase(false).useUpperCase(false).build()); 

,並把它輸出類似...

xt7$93l]]#]@$xc 
]o#r=#[email protected] 
@_s5q6]#8i$h]## 
2#ccw_1]m3kaz_1 

有一些在你的代碼,你可以用一個遞歸(棧)溢出,在那裏你一遍一遍地調用一個方法結束點的,所以你真的需要檢查狀態可用標誌,並確保至少有一個是true

你仍然可以使用陣列(而不是List S),但其基本思想是一樣的

+0

我可以使用你的密碼生成器,但我真的感到很蠢,現在不會注意到pass + newpasschar錯誤的「錯誤」... –