static int PasswordLength;
Это объявляет переменную и инициализирует ее как 0 . Последняя часть - довольно запутанная черта Java, я sh они ее избежали.
static char[] GeneratedCharacters= new char[PasswordLength];
Это объявляет переменную массива и инициализирует ее массивом длины - подождите, что значение PasswordLength
? Правильно, 0, поэтому массив длины 0, массив без элементов в нем.
PasswordLength= PassLengthScanner.nextInt();
Это считывает число с клавиатуры и сохраняет его в PasswordLength
. Тем не менее, это не меняет массив. Массив по-прежнему имеет длину 0.
GeneratedCharacters[i]=(RandomOne);
Это пытается сохранить значение в элементе массива. Первый раз, когда ваш l oop i
равен 0, поэтому он должен храниться в элементе с индексом 0, что чаще всего должно быть в порядке. Только поскольку ваш массив пуст, он завершается с ошибкой и трассировкой стека, которую вы видели (надеюсь, вы видели трассировку стека).
Решение состоит в том, чтобы выделить массив с new
внутри метода main
и только после того, как вы прочитали длину в PasswordLength
.
Информация о бонусе: не используйте это для настоящих паролей. Каждый может увидеть здесь, в Stack Overflow, как вы их сгенерировали, а new Random()
дает предсказуемые случайные числа, когда мы можем приблизительно угадать, когда вы запустили вашу программу. Если вы хотите использовать программу для реальных паролей, инициализируйте TheGenerator
следующим образом:
Random TheGenerator= SecureRandom.getInstance("SHA1PRNG");
Краткая версия объяснения: A SecureRandom
дает непредсказуемые псевдослучайные числа, поэтому безопасен для генерации реальных паролей.