我的程序抛出一个ArrayIndexOutOfBoundsException,但有时只会抛出

时间:2015-03-07 00:49:45

标签: arrays indexoutofboundsexception selection-sort

我在高中读了一门计算机科学课,今天我们在选拔课上学到了一课。我写了一个程序(它可能很笨拙,但请耐心等待我,我正在学习)并且它的工作原因在于它排序,但有时它会抛出一个ArrayIndexOutOfBoundsException。只是有时。我不知道这是怎么可能的,因为我在整个程序中处理相同的数组,并且数组具有固定的长度。如果有人有一些见解,那将非常有帮助。

我认为该错误与int first = y[movedVariable];有关。但是,我不明白moveVariable是如何出界的,因为我很确定我编写了我的程序,以便它可以<数组的长度。

public class selectionSort
{
    public static int[] array;
    public static int movedVariable = 0;
    public static void main()
    {
        array = new int[10];
        int x;
        for (int count = 0; count < array.length; count++)
        {
            if (count == 0)
            {
                x = (int)(Math.random()*100+2);
                array[count] = x;
            }
            else
            {
                x = (int)(Math.random()*100+2);
                for (int y = 0; y < count; y++)
                {
                    while(x == array[y])
                    {
                        x = (int)(Math.random()*100+2);
                    }
                }
                array[count] = x;
            }
        }
        sort(array);
    }

    public static void sort(int[] x)
    {
        int thing = 0;
        for(int hello = 0; hello < x.length; hello++)
        {   
            int part = x[thing];
            for ( int count = thing; count < x.length-1; count++)
            {
                if( part > x[count+1] )
                {
                    part = x[count+1];
                }
            }
            thing++;
            swap( x, part);
        }

        int f = 0;
        String output = "";

        for( int val : x )
        { 
            if (f%10 == 0)
            {output += "\n";}
            output += val + " "; 
            f++;
        }
        System.out.print(output);
    }

    public static int[] swap(int [] y, int num)
    {
        int count = 0;
        int index = 0;
        for ( count = 0; count < y.length; count++)
        {
            if (y[count] == num)
            {index = count;}
        }
        int first = y[movedVariable];
        y[movedVariable] = y[index];
        y[index] = first;
        movedVariable++;
        return y;
        }
    }

1 个答案:

答案 0 :(得分:0)

为了好玩,我运行了你的代码1,000,000次迭代并且没有超出范围的异常,除非我没有在每次迭代之前将static movingVariable清除为0。

由于在前10次调用swap()之后,movingVariable是静态的,因此它将是10,如果进行另一次调用交换,你将获得超出范围的索引。但是,只有在每次运行多次调用sort()时才会发生这种情况。仅对需要在类的实例之间保留的值使用static。属于您的实例状态的非静态。其他一切的局部变量。否则你正在创建一个等待发生的漏洞。

我重构了你的类以删除具有相同功能的变量。例如,你的东西和你的movingVariable以及sort()中的hello变量只能是一个变量。尽量消除做同样事情的多个变量,比如瘟疫。它是非明显错误的来源。

另外,您将数组中的值传递给swap然后在数组中查找它以获取索引,这是浪费时间。只需传入索引即可进行交换。当您在两个不同的位置具有相同的值时,它还会为您的排序功能带来问题。交换将使用它找到的最后一个。 sort()应该处理数组中的重复值。这就解释了为什么用唯一值初始化数组。你不应该这样做。实际上,您应该使用明确添加的重复项来测试您的代码,以确保您的功能正常工作。

我将数组的打印移出了自己的方法。它对于在中间步骤进行调试非常有用,而不仅仅是在完成排序时。

我试着保持变量名相同且逻辑不变,以便您可以按照更改进行操作。

public class Main
{
    public static void sort(int[] x)
    {
        for (int movedVariable = 0; movedVariable < x.length; movedVariable++)
        {
            int part = x[movedVariable];
            int index = movedVariable;

            for (int count = movedVariable; count < x.length - 1; count++)
            {
                if (part > x[count + 1])
                {
                    part = x[count + 1];
                    index = count + 1;
                }
            }

            swap(x, index, movedVariable);
        }

        printArray(x);
    }

    private static void printArray(int[] x)
    {
        int f = 0;
        String output = "";

        for (int val : x)
        {
            if (f % 10 == 0)
            {
                output += "\n";
            }
            output += val + " ";
            f++;
        }
        System.out.print(output);
    }

    public static int[] swap(int[] y, int index, int movedVariable)
    {
        int first = y[movedVariable];
        y[movedVariable] = y[index];
        y[index] = first;
        return y;
    }

    public static void main(String[] args)
    {
        int[] array = new int[10];
        int x = 0;
        for (int count = 0; count < array.length; count++)
        {
            for (int y = count; --y >= 0; )
            {
                do
                {
                    x = (int) (Math.random() * 100 + 2);
                }
                while (x == array[y]);
            }

            array[count] = x;
        }

        printArray(array);
        sort(array);
    }
}