import java.util.Random;
public class PasswordRandomizer {
// Define the variables
private Random random = new Random();
private int passwordLength;
private String password = "";
public PasswordRandomizer(int length) {
// Initialize the variable
this.passwordLength = length;
}
public String createPassword() {
// write code that returns a randomized password
for(int i = 0; i < this.passwordLength; i++){
int j = random.nextInt();
char symbol = "abcdefghijklmnopqrstuvwxyz".charAt(j);
this.password = this.password + symbol;
}
return this.password;
}
}
如何将字符添加到字符串中,我试过这个但是我收到了这个错误:
&#34;线程中的异常&#34; main&#34; java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-414383904&#34;。
答案 0 :(得分:7)
这是因为random.nextInt()
返回-2,147,483,648和2,147,483,647之间的值。
你想要的是random.nextInt("abcdefghijklmnopqrstuvwxyz".length())
我还会将"abcdefghijklmnopqrstuvwxyz"
分配给常量。
private final static String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
Char randomChar = ALPHABET.charAt(random.nextInt(ALPHABET.length()));
答案 1 :(得分:1)
您的问题不是连接而是随机生成器
int j = random.nextInt();
char symbol = "abcdefghijklmnopqrstuvwxyz".charAt(j);
您需要使用范围绑定的nextInt
答案 2 :(得分:1)
您正在使用Random.nextInt
而没有任何约束。此方法返回2 ^ 32种可能性的任何整数。使用有界Random.nextInt("abcdefghijklmnopqrstuvwxyz".length())
答案 3 :(得分:1)
试试这个:
int j = random.nextInt(26);
可能的值将包含在0到25之间(包括在内),它将与您的字母索引相匹配。
答案 4 :(得分:1)
这是问题所在:
int j = random.nextInt();
char symbol = "abcdefghijklmnopqrstuvwxyz".charAt(j);
charAt
方法要求其参数在字符串的范围内 - 您只使用Random.nextInt()
中的随机整数,该整数可以包含 any {{1值:
从此随机数生成器的序列中返回下一个伪随机数,均匀分布的int值。 nextInt的一般契约是伪随机生成并返回一个int值。所有2 32 可能的int值都以(近似)相等的概率产生。
你应该使用类似的东西:
int
这样你知道private static String final ALPHABET = "abcdefghijklmnopqrstuvwxyz";
...
int j = random.nextInt(ALPHABET.length());
char symbol = ALPHABET.charAt(j);
将在字符串的范围内(即j
)。
我的代码还有其他一些变化:
0 <= j < ALPHABET.length()
使用实例变量(目前您生成的每个密码都会比前一个更长)Random
代替SecureRandom
来生成密码所以:
Random
答案 5 :(得分:0)
代码random.nextInt()创建的值大于“abcdefghijklmnopqrstuvwxyz”中字符的长度。
使用0到25之间的值。使用 random.nextInt(25);
代替random.nextInt();