2013-09-10 3 views
1
import java.util.Random; 
import java.util.Scanner; 

public class PassGen { 
public static void main(String[] args) { 
    String[] characters = {"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","0","1","2","3","4","5","6","7","8","9"}; 
    StringBuilder b = null; 

    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter password length."); 
    int length = scan.nextInt(); 
    while (length > 20 || length < 6) { 
     System.out.println("Password must be between 6 and 20 characters long."); 
     length = scan.nextInt(); 
    } 

    Random rand = new Random(); 

    for (int i = 0; i <= length; i++) { 
     int x = rand.nextInt(characters.length) + 1; 
     b = new StringBuilder(length + 1); 
     String s = characters[x]; 
     b.append(s); 
    } 

    System.out.println("Your password is: " + b.toString()); 
} 
} 

По какой-то причине, когда я запускаю эту программу, она пробегает цикл цикла только один раз перед отображением одного случайного символа независимо от введенной длины.За цикл работает только один раз до завершения программы

ответ

2

Нет, цикл выполняется несколько итераций - но на каждой итерации, вы создаете новый StringBuilder:

// This is inside the loop, but should be outside. 
b = new StringBuilder(length + 1); 

Обратите внимание, что иногда, я бы ожидать, что цикл, чтобы бросаться исключение - и если это не так, вы получите в итоге строку, которая больше, чем вы хотите. В принципе, у вас есть три совсем по-одной ошибки ... Вы должны иметь:

b = new StringBuilder(length); 
for (int i = 0; i < length; i++) { 
    int x = rand.nextInt(characters.length); 
    b.append(characters[x]); 
} 

Также отметим, что было бы проще, если бы вы только что строку вместо массива строк, и используется charAt :

String characters = "ABCDE...9"; 
... 

int x = rand.nextInt(characters.length()); 
b.append(characters.charAt(x)); 
+2

darn, мне нужно набрать быстрее: P –

+2

Быстрее, чем Джон Скит? o.O: P –

0
b = new StringBuilder(length + 1); 

должно быть вне для цикла. То, как вы это делаете, b создается каждый раз, когда выполняется цикл for.

0

Вы всегда воссоздаете свой объект b внутри своей петли. Он всегда будет содержать только один символ.

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