走出界限异常,无法弄明白为什么

时间:2013-12-04 00:13:18

标签: java arrays indexoutofboundsexception bubble-sort

我正在制作一个程序,它接受一个整数数组并使用“气泡排序”对其进行排序(切换相邻的数字直到它的顺序。)我一直在试图弄清楚为什么我得到这个超出界限错误,但它对我来说仍然没有多大意义,因为数组对我来说仍然是一个非常新的概念。

public static boolean onePass(int[] a) {
    boolean ordered = true;
    for (int i = 0; i+1 < a.length; i++) {
        if (a[i] < a[i+1]) {
            ordered = false;
            return ordered;
    } }
    return ordered;
}
public static void printArray(int[] b) { 
    for(int i = 0; i < b.length; i++){ 
    System.out.println(i + "   " + b[i]); 
    }
}
public static int[] bubbleSort(int[] unsorted) {
    int[] a = unsorted;
    boolean sorted = false;
    for (int i = 0; sorted == true; i++) {
    sorted = onePass(a);
        if (i > a.length) {
            i = 0;    
        }
        if (a[i] < a[i+1] && i < a.length) {
            swapElement(a, i, i + 1);
            //System.out.println(i + " " + (i+1));
    } 
    }
    return a;
    }

onePass方法应该检查它是否按顺序。

我得到:“线程中的异常”main“java.lang.ArrayIndexOutOfBoundsException:25” 在这一行:if(a [i]&lt; a [i + 1]&amp;&amp; i&lt; a.length)

很抱歉,如果这是一个非常愚蠢的问题 我在学习java的课程中,所以可能有一种更有效的方法来制作这个程序,但是到目前为止使用我们学到的东西,这是我能够理解和自己编写的。

编辑:我正在排序的数组在我用BufferedReader读取的文本文档中有25个数字(0-24)。

编辑2:找到一种更有效的冒泡排序方式,最后评论所有这些,但感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您需要确保i + 1不会越界。

在此处的此行,在访问i < a.length之前执行a[i]检查,同样,在尝试访问a[i+1] 之前添加检查

if (i < a.length && /* check i+1 */ && a[i] < a[i+1])

由于这是作业,我会让你填写实际的代码。

答案 1 :(得分:0)

你超越了数组中的最后一个元素。

因为您正在检查i是否不大于或等于长度,但a[i+1]将使其等于长度,因为数组为0索引,它将在到达之后达到一个元素最后。

试试这个:

if (i >= a.length-1) {
    i = 0;    
}
else if (a[i] < a[i+1]) {
    swapElement(a, i, i + 1);
    System.out.println(i + " " + (i+1));
} 

修改

您的第三行也有同样的问题:

for (int i = 0; i+1 < a.length; i++) {

应该是:

for (int i = 0; i+1 < a.length-1; i++) {

因为下一行:

if (a[i] < a[i+1]) {

<强> EDIT2

i不大于或等于a.lengtha.length为25时,i将最多为24,当i为24时a+1将是25,超出范围。

答案 2 :(得分:0)

在相关专栏中,请尝试将其替换为:

a[i] < a[i+1] && i < a.length 

使用:

i < a.length && a[i] < a[i+1]

在最后一次迭代时,您仍然可以尝试访问元素i+1,然后再确保它小于数组的长度。所以在这种情况下,你得到一个java.lang.ArrayIndexOutOfBoundsException