这个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.
}
}错误就在:
int mid = (low + high) / 2;
这行的问题是当low和high的和超过2^31-1, 也就是Java里最大整数值时,整数溢出就发生了,而mid就变成负数了, 于是JVM就抓狂了,于是ArrayIndexOutOfBoundsException就发生了。
解决方法是把它改成:int mid = low + ((high - low) / 2);
二分查找Bug解析
本文详细解析了一个关于二分查找算法中的整数溢出Bug,该Bug发生在计算中间索引时,当low和high之和超过Java整数最大值时导致溢出。文章提供了修复方案,将mid的计算方式改为mid = low + ((high - low) / 2),避免了溢出问题。
5777

被折叠的 条评论
为什么被折叠?



