处理数组和冒泡排序时的运行时错误(Java)

时间:2015-10-14 22:15:25

标签: java runtime-error bubble-sort

我最近被分配为一个数字列表创建一个冒泡排序(你将在我要向你展示的代码中找到列表),但是,虽然程序编译完全正常,但我总是得到这个cmd中的运行时错误...

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
        at hw.main(hw.java:17)

这是我到目前为止所拥有的。

//Ch 9 HW 7
class hw
{
    public static void main(String[] args)
    {
        int[] x = new int[10];
        x[0] = 100;
        x[1] = 23;
        x[2] = 15;
        x[3] = 23;
        x[4] = 7;
        x[5] = 23;
        x[6] = 2;
        x[7] = 311;
        x[8] = 5;
        x[9] = 8;
        x[10] = 3;
        System.out.println(bubbleSort(x));
    }
    public static int[] bubbleSort(int[] x)
    {
        int placehold = 0;
        for (int i = 0; i < x.length; i++)
        {
            if (x[i] > x[i + 1])
            {
                placehold = x[i + 1];
                x[i] = x[i + 1];
                x[i + 1] = placehold;
            }   
        }
        return x;
    }   
}

我想知道你们是否可以给我一个错误的解释和解决方法。万分感谢

〜安德鲁

编辑: 这段代码给了我一个&#34;找不到符号&#34; &#34; Arrays&#34;

的错误
//Ch 9 HW 7
class hw
{
    public static void main(String[] args)
    {
        int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};
        String y = Arrays.toString(bubbleSort(x));
        System.out.println(y);
    }
    public static int[] bubbleSort(int[] x)
    {
        int placehold = 0;
        for (int i = 0; i < x.length - 1; i++)
        {
            if (x[i] > x[i + 1])
            {
                placehold = x[i + 1];
                x[i] = x[i + 1];
                x[i + 1] = placehold;
            }   
        }
        return x;

    }   
}

最终编辑与更正:

这是那些好奇的CORRECT代码。

//Andrew Mancinelli
import java.util.*;
class hw
{ 
    public static void main(String[] args)
    {
        int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};
        String y = Arrays.toString(bubbleSort(x));
        System.out.println(y);
    }
    public static int[] bubbleSort(int[] x)
    {
        for (int start = 0; start < x.length - 1; start++)
        {
            int min = x[start];
            int indexMin = start;
            for (int j = start + 1; j < x.length; j++)
            {
                if (x[j] < min)
                {
                    min = x[j];
                    indexMin = j;
                }   
            }
            x[indexMin] = x[start];
            x[start] = min;
        }
        return x;
    }   
}

3 个答案:

答案 0 :(得分:2)

Bug#1

您创建的数组有10个元素的容量:

int[] x = new int[10];

如果你仔细观察,你会分配11个元素:

x[0] = 100;
x[1] = 23;
x[2] = 15;
// ...
x[10] = 3;

因此,当您声明它时,可能会将容量更改为11:

int[] x = new int[11];

但是有一种更简单的方法来创建该数组:

int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};

请注意,此处未指定数组的大小。 因此,你不能错误地给出太小或太大的尺寸。

Bug#2

在此代码中,当i = x.length - 1时,表达式x[i + 1]将超出范围:

for (int i = 0; i < x.length; i++)
{
    if (x[i] > x[i + 1])
    {
        placehold = x[i + 1];
        x[i] = x[i + 1];
        x[i + 1] = placehold;
    }   
}

要解决此问题,请更改循环条件,以使i无法到达x.length - 1

for (int i = 0; i < x.length - 1; i++)
<3>错误3

使用int[]打印System.out.println将无法生成您想要的内容。 这就是你想要的:

System.out.println(Arrays.toString(bubbleSort(x)));

没有Arrays.toString(...),您看到的值[I@6d06d69c是数组哈希码的十六进制表示。这是Object.toString的默认实现,数组继承。 这很没用,获取数组的字符串表示的标准方法是使用Arrays.toString(...)

注意:Arrays位于java.util,因此您需要为此添加导入:

import java.util.Arrays;

答案 1 :(得分:0)

BubbleSort方法的if条件是在最后一次迭代中要求索引i + 1请求一个不存在的索引,这就是抛出异常的原因

答案 2 :(得分:0)

在你的循环中,i的值从0变为10。 所以当i = 10时,x [i + 1] = x [11]但是你的数组中没有第11个索引,这就是你得到名为ArrayIndexOutOfBoundsException的运行时异常的原因。

所以你可以解决这个问题: 1)确保在访问阵列时不超过数组索引 2)使用错误消息作为调试错误的线索。