Java二分查找(Binary Search)查找第5个元素时抛出数组越界异常
兄弟,我来帮你拆解这个问题——你遇到的ArrayOutOfBoundsException本质是数组索引的0起始特性和二分查找边界逻辑错误导致的,跟if-else没关系,咱们一步步说:
核心原因分析
1. 数组索引的认知误区
Java数组是0-based索引(从0开始计数),当你创建一个含5个元素的数组时,有效索引范围是0~4,而不是1~5。如果你口中的“第5个元素”对应的索引是5,直接访问arr[5]必然触发越界。
2. 二分查找方法的边界初始化错误
这是最可能的元凶:标准二分查找的high边界应该初始化为arr.length - 1,如果你的binarySearch方法里把high设成了arr.length,那么当查找最后一个元素(比如第5个元素,索引4)时,循环中计算出的mid有可能等于arr.length(也就是5),此时访问arr[mid]就会触发越界。
举个错误的反例:
// 错误的边界初始化 int high = arr.length; // 应该是arr.length - 1
当数组size=5时,high=5,循环中如果low=4、high=5,mid=(4+5)/2=4,这时候没问题,但如果后续逻辑调整low=mid+1=5,此时low<=high(5<=5)成立,mid=5,访问arr[5]直接报错。
3. 你的数组输入方法不完整
你给出的arrayEntry()代码没有完成元素赋值和数组返回,这会导致后续使用的数组可能未初始化,但你说其他测试用例正常,所以这个不是核心问题,但必须修正。
解决方案
1. 修正索引认知
如果你是手动指定查找“第5个元素”,请传入索引4而非5。
2. 修复二分查找的边界逻辑
这里给你一个标准的、不会越界的二分查找实现:
public static int binarySearch(int[] arr, int target) { // 先判断数组合法性,避免空指针或空数组 if (arr == null || arr.length == 0) { return -1; } int low = 0; int high = arr.length - 1; // 关键:这里必须是length-1 while (low <= high) { // 用low + (high-low)/2代替(low+high)/2,避免整数溢出 int mid = low + (high - low) / 2; if (arr[mid] == target) { return mid; // 找到目标,返回索引 } else if (arr[mid] < target) { low = mid + 1; // 目标在右半区 } else { high = mid - 1; // 目标在左半区 } } return -1; // 未找到目标 }
重点注意high的初始值,以及循环条件low <= high(保证最后一个元素能被检查到)。
3. 补全数组输入方法
你的arrayEntry()缺少元素赋值和返回逻辑,修正后如下:
private static int[] arrayEntry() { Scanner scan = new Scanner(System.in); System.out.println("Enter the size of the array: "); int size = scan.nextInt(); int[] arr = new int[size]; System.out.println("Enter the items..."); // 循环给每个数组元素赋值 for (int i = 0; i < size; i++) { arr[i] = scan.nextInt(); } scan.close(); // 关闭Scanner,避免资源泄漏 return arr; // 返回初始化好的数组 }
为什么if-else没用?
if-else是用来处理逻辑分支的,但你的问题是索引本身超出了数组的有效范围,if-else并没有检查索引是否合法,也没有修正二分查找的边界错误,所以自然解决不了问题。
内容的提问来源于stack exchange,提问作者Kumar Shivam

