密码生成器在从扫描程序获取密码长度时引发索引越界异常



所以我为我的 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("nnnYour 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);
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 处的元素中,这通常应该没问题。只是因为您的数组为空,它才会失败并出现您看到的异常和堆栈跟踪(我希望您看到了堆栈跟踪(。

解决方案是在main方法中分配带有new的数组,并且只有在将长度读入PasswordLength之后。

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

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

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

相关内容

最新更新