如何修复:线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException“对于java中的随机数的布尔数组[duplicate]

问题描述 投票:0回答:3

我正在制作一个程序,我可以获得他们想要的随机数和他们想要的最高数字,但是当我运行代码时,它并没有给我他们要求的数量。它要么给我一个数字,要么没有。然后它以红色表示“线程中的异常”主“java.lang.ArrayIndexOutOfBoundsException:9 at practice4.practice4.main(practice4.java:38)”。

double randomNum;
        int highestNumber, numsInLottery, display;
        boolean[] numberUsed;

        System.out.println("Welcome to the Lottery Number Generator!");

        System.out.println("How many numbers are in your lottery?");
        numsInLottery = TextIO.getInt();

        System.out.println("What is the highest possible number?");
        highestNumber = TextIO.getInt();


        numberUsed= new boolean [numsInLottery];

        for (int index = 0; index < numsInLottery; index++)
        {
        numberUsed [index]= false;

        while(index < highestNumber)
        {
            do
            {

                randomNum = Math.random() * highestNumber + 1;
                display = (int) randomNum ;

            } while (numberUsed [display - 1 ] ); 

        System.out.print(display + " ");
        numberUsed [display + 1] = true;

        }   
        }
        }   
        }

在我有numberUsed= new boolean [numsInLottery];之前,我不小心把numsInLottery放在了最高号。当我拥有它时它会给我所有数字。但是现在我已经改变它了它不再起作用这就是我现在得到的

Welcome to the Lottery Number Generator!
How many numbers are in your lottery?
6
What is the highest possible number?
? 30
1 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 21
    at practice4.practice4.main(practice4.java:35)
java arrays random indexoutofboundsexception
3个回答
1
投票

在您的情况下,您似乎需要使用布尔数组才能验证之前未生成的生成数,在这种情况下,这是您将需要的核心逻辑。

int[] lotteryNumbers = new int[numsInLottery];
boolean[] lotteryNumberHasBeenGenerated = new boolean[highestNumber];

for(int i=0;i<highestNumber;i++){ //none of the numbers have been generated at this point
    lotteryNumberHasBeenGenerated[i]=false;
}

for (int i = 0; i < numsInLottery; i++) {
    int random;
    do{
        random=((Double)(Math.random() * highestNumber)).intValue();
    }while(lotteryNumberHasBeenGenerated[random]);

    lotteryNumbers[i] = random;
    lotteryNumberHasBeenGenerated[random]=true; //the number is maked as generated

}

这将使技巧和最终方法看起来像这样:

public void lottery() {

    System.out.println("Welcome to the Lottery Number Generator!");
    System.out.println("How many numbers are in your lottery?");
    int numsInLottery = TextIO.getInt();
    System.out.println("What is the highest possible number?");
    int highestNumber = TextIO.getInt();

    int[] lotteryNumbers = new int[numsInLottery];
    boolean[] lotteryNumberHasBeenGenerated = new boolean[highestNumber];

    for(int i=0;i<highestNumber;i++){ //none of the numbers have been   generated at this point
        lotteryNumberHasBeenGenerated[i]=false;
    }

    for (int i = 0; i < numsInLottery; i++) {
        int random;
        do{
            random=((Double)(Math.random() * highestNumber)).intValue();
        }while(lotteryNumberHasBeenGenerated[random]);

        lotteryNumbers[i] = random;
        lotteryNumberHasBeenGenerated[random]=true; //the number is maked as    generated

}

    System.out.println("Lottery numbers:\n" + Arrays.toString(lotteryNumbers));
}

虽然如果是这种情况,你会遗漏很多验证:S

此外,当您尝试访问数组中没有的位置时,您在控制台日志中遇到的问题会被抛出,例如,如果您创建了一个大小为5的数组并且您正在访问位置编号9或索引8异常。 Here is an explanation如何运作


1
投票
do
{
    randomNum = Math.random() * highestNumber + 1;
    display = (int) randomNum ;

} while (numberUsed [display - 1 ] );

在这段代码中,你正在访问一些可能甚至不存在的数组的随机索引,例如你有25作为随机数,而你只有大小为6的数组,所以当你访问numberUsed [25]时你会得到IndexOutOfBounds的这个例外


0
投票

同样,正如我之前提到的,我假设您的教授希望您使用布尔数组来检查是否已存在随机生成的数字。

实现此目的的一种方法是创建一个布尔数组(isLotteryNumberGenerated),其中每个元素表示是否已生成该元素的索引号(例如,如果我们生成随机数3,则检查isLotteryNumberGenerated[3] == truetrue意味着已经生成了数字3(反之亦然,如果false)。因此,布尔数组的大小必须为highestNumber + 1,以便为每个可能生成的数字创建一个索引(从0 - highestNumber)

每次在i数组中为元素lotteryNumbers生成随机数时,您需要检查是否已为另一个lotteryNumbers元素生成该数字。在下面的代码中,我使用循环的do...while循环,直到它生成一个之前没有生成过的数字。

使用上面的一些White_King代码......

public void lottery() {

    System.out.println("How many numbers are in your lottery?");
    int numsInLottery = TextIO.getInt();
    System.out.println("What is the highest possible number?");
    int highestNumber = TextIO.getInt();

    int[] lotteryNumbers = new int[numsInLottery];
    boolean[] isLotteryNumberGenerated = new boolean[highestNumber + 1];

    for (int i = 0; i < numsInLottery; i++) { 
        do { 

            lotteryNumbers[i] = (int) (Math.random() * (highestNumber + 1)); 

        } while (isLotteryNumberGenerated[lotteryNumbers[i]]); 

        isLotteryNumberGenerated[lotteryNumbers[i]] = true; 

    }

   System.out.println("Lottery numbers:\n" + Arrays.toString(lotteryNumbers));

}
© www.soinside.com 2019 - 2024. All rights reserved.