Class ArrayIndexOutOfBoundsException - 试图摆脱它

时间:2015-11-01 01:51:25

标签: java

我正在编写一个程序,用于输入随机数和迭代次数的用户输入。我试图对此进行冒泡排序(对于我的课程,我需要使用气泡和选择排序)。我的初始代码做得很好,直到我努力添加部分进行迭代然后选择排序。现在,当我运行我的代码时,它将停止并在我的帖子标题中指出错误。它停在的行是 randomArray [d]> randomArray [d + 1] (下面代码中的最后一行)。

根据我在尝试解决此问题时所研究的内容,它表示当数组被非法索引访问时,或者索引为负数或大于数组大小时,通常会抛出错误。我尝试了一些不同的东西来解决这个问题,但此刻我还在墙上。如果有人能提供一些方向,我将非常感激!

由于

    Scanner input = new Scanner (System.in);
    System.out.println("Enter a number please: ");
    int n = input.nextInt();

    //Get user input for number if iterations
    System.out.println("Enter a number of iterations please: ");
    int numIfor = input.nextInt();

    //create array of random numbers
    int[] randomArray = new int[n];
    Random bubbleRandom = new Random();

    //fill in the array of random numbers
    for(int i=0; i < n; i++) {
        randomArray[i] = bubbleRandom.nextInt(100);
    }
    //Printing the array before the sort
    System.out.println("The numbers before the Bubble Sort: ");
    for(int i=0; i < n; i++) {
        System.out.print(randomArray[i] + " ");
    }
    System.out.println();
    //Printing the array out after the Bubble Sort
    int bubble = 0;
    int sort = 0;
    long startTime = System.currentTimeMillis();        

        for (int c=0; c < (numIfor - 1); c++)
    {
        for (int d=0; d < numIfor - c -1; d++)
    {
        if (randomArray[d]>randomArray[d+1])

    {
        bubble = randomArray[d];
        randomArray[d] = randomArray[d+1];
        randomArray[d+1] = bubble;
        sort++;
    }
    }
    }
    long endTime = System.currentTimeMillis();
    long runningTime = endTime-startTime;

       System.out.println("The total number of iterations is: " +     numIfor);
       System.out.println("The total count of numbers sorted is: " + sort);
       System.out.println("The total time elapsed was: " + runningTime);
       System.out.println("The numbers after the Bubble Sort: ");
        for(int i=0; i < n; i++){
            System.out.print(randomArray[i] + " ");

    }

    }

}  

1 个答案:

答案 0 :(得分:0)

可能发生的是d+1变得比数组的最后位置更大。您可以通过更改最后一个for循环来确保它只到达数组的末尾:

这里的问题是你循环到numIfor,这是一个与数组长度完全无关的值(n)。这意味着如果用户输入numIfor和n,那么numIfor&gt; n,那么你的代码必然会抛出异常。

对此的解决方案是使用数组的实际长度作为限制器值,因此:

for (int c=0; c < randomArray.length-1; c++)
{
    for (int d=0; d < randomArray.length-c-1; d++)
{
    if (randomArray[d]>randomArray[d+1])

这假设您希望d遍历数组的所有值。但真正的要点是你应该总是尝试循环到小于数组的长度(-1是因为你正在检查数组[d + 1])。如果您尝试访问数组中的所有值,则此方法效果最佳,因为它可以保证您不会超出范围。