Генератор паролей генерирует IndexOutOfBoundsException, когда длина пароля берется из сканера - PullRequest
0 голосов
/ 25 января 2020

Итак, я сделал Генератор случайных паролей как домашнее задание для своего класса Uni. Однако у меня есть проблема с разрывом и выходом кода с сообщением «java .lang.IndexOutOfBoundsException: недопустимый диапазон массива: от 0 до 0» после его получает первое изменение l oop в методе, который должен генерировать мой пароль. Это обновленная версия кода, которая реализует сканер как опцию для ввода пользователем желаемого пароля с клавиатуры. В предыдущей версии ios, когда длина пароля была жестко задана в виде заданного числа, она работала нормально. Если в формате вопроса есть какая-либо ошибка или, возможно, код выглядит некрасиво или что-то в этом роде, я заранее прошу прощения, поскольку мои навыки кодирования находятся на самом низу моего текущего этапа.

package com.company;
import java.util.*;

public class Main {

    static final String AllTheCharactersOnMyKeyBoard = "~!@#$%^&*()_+`1234567890-=QWERTYUIOP{}qwertyuiop[]ASDFGHJKL:|asdfghjkl;'|ZXCVBNM<>?zxcvbnm,./'";
    static int PasswordLength;
    static List<Character> ListOfCharsOnMyKBoard = convertsTheStringToCharacterList(AllTheCharactersOnMyKeyBoard);
    static char[] GeneratedCharacters= new char[PasswordLength];

    public static void main(String[] args) {
        Scanner PassLengthScanner=new Scanner(System.in);
        System.out.println("How many Symbols You wish the new password to contain?");
        PasswordLength= PassLengthScanner.nextInt();
        GeneratedPassword();
        System.out.println(ListOfCharsOnMyKBoard);
        System.out.println("\n\n\nYour Password is:");
        System.out.println(GeneratedCharacters);
    }
    public static List<Character> convertsTheStringToCharacterList(String AllTheCharactersOnMyKeyBoard){
        List<Character> MyKeyBoardCharacterList= new ArrayList<>();
        for (char CHARACTER : AllTheCharactersOnMyKeyBoard.toCharArray()){
            MyKeyBoardCharacterList.add(CHARACTER);
        }
        return MyKeyBoardCharacterList;
    }
    public static void GeneratedPassword(){
        Random TheGenerator= new Random();
        for (int i=0; i<PasswordLength; i++) {
            char RandomOne = ListOfCharsOnMyKBoard.get(TheGenerator.nextInt(ListOfCharsOnMyKBoard.size()));
            GeneratedCharacters[i]=(RandomOne);
        }
    }
}

Отслеживание стека:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at com.company.Main.GeneratedPassword(Main.java:31)
    at com.company.Main.main(Main.java:15)

Строка 31 программы - это строка:

        GeneratedCharacters[i]=(RandomOne);

1 Ответ

1 голос
/ 25 января 2020
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 дает непредсказуемые псевдослучайные числа, поэтому безопасен для генерации реальных паролей.

...