【问题标题】:binarySearch Method Throwing ArrayIndexOutOfBounds Exception - JavabinarySearch 方法抛出 ArrayIndexOutOfBounds 异常 - Java
【发布时间】:2012-10-10 19:53:28
【问题描述】:

我不知道为什么这个方法会抛出 ArrayIndexOutOfBounds 异常。

When I change the initial "high" 值为"int high = array.length - 1;",程序将return any integer value 我搜索。

我做错了什么?

提前致谢!


public class BinarySearch {

public static void main(String[] args) {

    int searchValue = 12;
    int[] givenNums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    binarySearch(givenNums, searchValue);
    System.out.println("\nResult: " + searchValue);

}

public static int binarySearch(int[] array, int key) {
    int low = 0;
    int high = array.length;
    int mid = (low + high) / 2;
    int i = 0;
    System.out.println();

    while (low <= high) {
        System.out.print(i + " ");
        if (array[mid] < key) {
            low = mid + 1;
            mid = (low + high) / 2;
        } else if (array[mid] > key) {
            high = mid - 1;
            mid = (low + high) / 2;
        }
        else
            return mid;

        i++;
    }
    return -1;
}
}

【问题讨论】:

  • 你刚刚发布了a very similar question。您已经被告知为什么会发生此错误:您不能将 array.length 设置为高。让代码无法运行完成并不比它无法产生正确的答案更可取(至少在这种情况下不是)。将high 设置为array.length 而不是array.length - 1 并不能解决任何问题,只会让事情变得更糟。
  • @user1735982.. 查看我的帖子以了解您到底在做什么..
  • 不同的方法,不同的问题。

标签: java exception methods binary-search indexoutofboundsexception


【解决方案1】:

对于high 是否表示最大值,您需要保持一致,它可以是包含或独占。你从它作为一个独占的上限开始:

int high = array.length;

但是你的 while 循环条件只有在它是 inclusive 上限时才适用:

while (low <= high)

您可能应该将while 条件更改为:

while (low < high)

...稍后也更改high的分配。

或者,您可以保持包容性,并将初始值更改为array.length - 1。

这将阻止low == high == mid == array.length 发生爆炸的情况。

我还建议将 mid = (low + high) / 2 计算移动到 while 循环中的第一条语句 - 这样您就可以摆脱重复的代码。

while (low < high) {        
    mid = (low + high) / 2;
    System.out.print(i + " ");
    if (array[mid] < key) {
        low = mid + 1;
    } else if (array[mid] > key) {
        high = mid;
    }
    else {
        return mid;
    }
    i++;
}

【讨论】:

    【解决方案2】:

    数组的最大索引是array.length - 1,因为它们从 0 开始。

    【讨论】:

      【解决方案3】:

      java中的数组是从0开始索引的,也就是说……

      int[] arr = new int[10];

      第一个值为arr[0],最后一个值为arr[9],长度为10。

      【讨论】:

        猜你喜欢
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 2015-04-18
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多