我的程序滞后于> 100个字符键

时间:2016-03-06 10:19:44

标签: java

我的类生成密码滞后于> 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();

1 个答案:

答案 0 :(得分:2)

以下是您必须更改的行

arr[i]=characters1[r.nextInt((characters1.length - 0) + 1) + 0];

arr[i]=characters1[r.nextInt(characters1.length)];

Random#nextInt会生成从0input -1的数字。如果您使用的是characters1.length + 1,则表示您要求该计划生成从0characters1.length的数字。由于数组的长度始终为lastIndex + 1,因此您获得ArrayIndexOutOfBoundsException

实施例

如果你的数组的长度是84,你实际上要求生成0到84之间的数字(85个元素 - 因此太多了)。

PS:-0+0有什么关系? :)