0

所以我做了一个随机密码生成器作为我的 Uni 类的作业,但是我确实遇到了一个问题,即代码中断并在第一次迭代时出现“java.lang.IndexOutOfBoundsException:无效数组范围:0 到 0”消息循环输入应该生成我的密码的方法。这是一个更新版本的代码,它实现了扫描仪作为用户从键盘输入他/她想要的密码长度的选项。在以前的版本中,当密码长度被硬编码为一个设定的数字时,它工作得很好。如果问题格式有任何错误,或者代码看起来很丑或其他什么,我会事先道歉,因为我的编码技能在我目前的阶段处于最底层。

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);
4

1 回答 1

1
static int PasswordLength;

这声明了一个变量并将其初始化为 0。后一部分是 Java 的一个非常令人困惑的特征,我希望他们避免它。

static char[] GeneratedCharacters= new char[PasswordLength];

这声明了一个数组变量并将其初始化为一个长度数组——等等, 的值是PasswordLength多少?对,0,所以一个长度为 0 的数组,一个没有元素的数组。

    PasswordLength= PassLengthScanner.nextInt();

这会从键盘读取一个数字并将其存储在PasswordLength. 但是,它不会更改数组。数组的长度仍然为 0。

        GeneratedCharacters[i]=(RandomOne);

这会尝试将值存储到数组元素中。第一次通过你的循环i是 0,所以它应该存储到索引 0 的元素中,这通常应该没问题。只是因为您的数组是空的,它才会因您看到的异常和堆栈跟踪而失败(我希望您看到了堆栈跟踪)。

new解决方案是在方法内部分配数组,main并且仅在您将长度读入PasswordLength.

奖励信息:请勿将其用于真实密码。每个人都可以在 Stack Overflow 上看到您是如何生成它们的,并new Random()在我们可以大致猜测您运行程序时给出可预测的随机数。如果您想将该程序用于真正的密码,请TheGenerator像这样初始化:

    Random TheGenerator= SecureRandom.getInstance("SHA1PRNG");

简短的解释:ASecureRandom给出了不可预测的伪随机数,因此生成真实密码是安全的。

于 2020-01-25T12:53:10.133 回答