这个bug够隐蔽的。
public
class
BinarySearch
...
{
public static int binarySearch(int[] a, int key) ...{
int low = 0;
int high = a.length - 1;
while (low <= high) ...{
int mid = (low + high) / 2;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
}
public static int binarySearch(int[] a, int key) ...{
int low = 0;
int high = a.length - 1;
while (low <= high) ...{
int mid = (low + high) / 2;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
}
错误就在:
int mid = (low + high) / 2;
这行的问题是当low和high的和超过2^31-1, 也就是Java里最大整数值时,整数溢出就发生了,而mid就变成负数了, 于是JVM就抓狂了,于是ArrayIndexOutOfBoundsException就发生了。
解决方法是把它改成:int mid = low + ((high - low) / 2);