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

Run-time error when handling arrays and a bubble sort (Java)

我最近被指派为数字列表创建冒泡排序(您将在我将要向您展示的代码中找到该列表),但是,尽管程序编译得很好,但我总是得到这个运行-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;
    }   
}

我想知道你们是否可以给我一个错误的解释和修复它的方法。非常感谢

~安德鲁

编辑: 此代码为 "Arrays"

提供了 "cannot find symbol" 错误
//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;

    }   
}

最终编辑及更正:

这是给那些好奇的人的正确代码。

//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;
    }   
}

错误#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};

注意这里没有指定数组的大小。 因此,您不能错误地提供太小或太大的尺寸。

错误 #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

System.out.println 打印 int[] 不会产生您想要的结果。 这就是你想要的:

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

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

注意:Arraysjava.util中,因此您需要为此添加导入:

import java.util.Arrays;

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

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

所以你可以摆脱这个问题的事情是: 1)确保访问数组时不超过数组索引 2) 以错误信息为线索,调试错误。