【问题标题】:Getting out of bounds exception, cant figure out exactly why though越界异常,无法弄清楚为什么
【发布时间】:2013-12-04 00:13:18
【问题描述】:

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

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 方法应该检查它是否有序。

我得到:“线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:25” 在这一行: if (a[i]

对不起,如果这是一个超级愚蠢的问题 我在一个学习java的班级,所以可能有一种更有效的方法来制作这个程序,但是使用我们目前所学的,这是我自己能够理解和编写的。

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

编辑 2:找到了一种更有效的冒泡排序方法,最终将所有这些都注释掉了,但感谢您的帮助!

【问题讨论】:

  • 如果一个数组被声明为new int[3],它有多少个和哪些索引?当您执行a[i+1] 时会发生什么? i 可以取的最后一个值是多少?
  • ArrayIndexOutOfBoundsException:25 表示您正在尝试访问索引为 25 的元素。对于索引为 25 的数组,它必须至少包含 26 个元素(您甚至指出您了解这个从 0 开始的索引概念:The array that i am sorting has 25 numbers (0-24))
  • 我理解错误的含义,但我不明白为什么它超出 i = 23 使 i+1=24。
  • 尝试调试。这是一个很棒的工具。

标签: java arrays indexoutofboundsexception bubble-sort


【解决方案1】:

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

在此行,在访问a[i] 之前检查i &lt; a.length,类似地,在您尝试访问a[i+1] 之前添加检查

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

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

【讨论】:

  • 检查 i+1 是什么意思?
  • 检查数组是否足够大,以便在索引i+1 处实际存在一个单元格。
【解决方案2】:

在有问题的行中,尝试替换它:

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

与:

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

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

【讨论】:

    【解决方案3】:

    您将超出数组中的最后一个元素。

    因为您正在检查 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.length 并且a.length 为25 时,i 将达到24,当i 为24 时a+1 将是25,超出范围所以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多