我的类生成密码滞后于> 100长度键,并引发异常。 这是我的密钥生成器类:
package dialogs;
import java.io.IOException;
import java.util.Random;
public class AdvKey {
byte[] concatenateByteArrays(byte[] a, byte[] b) {
byte[] result = new byte[a.length + b.length];
System.arraycopy(a, 0, result, 0, a.length);
System.arraycopy(b, 0, result, a.length, b.length);
return result;
}
private byte[] arr=null;
private byte[][] characters={"!@#$%^&*()_+=".getBytes(),
"1234567890".getBytes(),
"qwertyuiopasdfghjklzxcvbnm".getBytes(),
"QWERTYUIOPASDFGHJKLZXCVBNM".getBytes()};
public AdvKey(int size, boolean specials, boolean numbers, boolean charactersb, boolean bigCharacters) throws IOException {
byte[] characters1 = new byte[512];
characters1="1234567890".getBytes();
if(specials){
characters1=concatenateByteArrays(characters1, characters[0]);
}
if(numbers){
characters1=concatenateByteArrays(characters1, characters[1]);
}
if(charactersb){
characters1=concatenateByteArrays(characters1, characters[2]);
}
if(bigCharacters){
characters1=concatenateByteArrays(characters1, characters[3]);
}
arr=new byte[size];
Random r = new Random();
r.setSeed(System.currentTimeMillis());
for(int i = 0; i < arr.length; i++){
arr[i]=characters1[r.nextInt((characters1.length - 0) + 1) + 0];
}
}
@Override
public String toString(){
return new String(arr);
}
}
这是该代码抛出的异常:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 10
at dialogs.AdvKey.<init>(AdvKey.java:37)
(...)
当in for生成随机数时,会发生异常,并从characters1数组中获取它的id。
我使用
执行它String output = new AdvKey(200, true, true, true, true).toString();
答案 0 :(得分:2)
以下是您必须更改的行
arr[i]=characters1[r.nextInt((characters1.length - 0) + 1) + 0];
要
arr[i]=characters1[r.nextInt(characters1.length)];
Random#nextInt
会生成从0
到input -1
的数字。如果您使用的是characters1.length + 1
,则表示您要求该计划生成从0
到characters1.length
的数字。由于数组的长度始终为lastIndex + 1
,因此您获得ArrayIndexOutOfBoundsException
。
如果你的数组的长度是84,你实际上要求生成0到84之间的数字(85个元素 - 因此太多了)。
PS:-0
和+0
有什么关系? :)