You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二分查找数组时触发ArrayIndexOutOfBoundsException问题求助

二分查找数组越界问题修复方案

错误点及修复说明

  • 数组名不匹配:main方法中定义的数组是array2,但后续赋值、排序、调用方法时误用了未定义的array,需统一数组名。
  • 边界初始化错误:二分查找的last初始值设为array.length,数组最大合法索引是array.length-1,当mid计算到array.length时,访问array[mid]必然触发越界。需将last初始值改为array.length - 1。
  • 条件判断逻辑错误:将目标值比较写成了和索引last比较(array[mid] < last),完全偏离二分查找逻辑,应改为和要查找的find比较(array[mid] < find)。
  • double相等判断不严谨:直接用==比较double值会因精度问题漏判,改用差值绝对值小于极小阈值(如1e-9)判断相等。

修正后的完整代码

import java.lang.Math;
import java.util.Arrays;
import java.util.Random;

class Search{
    public static void main(String [] args){
        double [] array = new double [9999];  
        for(int i = 0; i < array.length; i++){   
            array[i] = Math.random() * 9999; 
        }
        Arrays.sort(array);
        double target = new Random().nextDouble(9999);
        System.out.println(binarySearch(array, target));
    }

    public static int binarySearch(double [] array, double find){
        int first = 0;
        int last = array.length - 1; // 修正边界初始值
        int mid = (first + last) / 2;
        while(first <= last){
            if(array[mid] < find - 1e-9){ // 考虑精度的小于判断
                first = mid + 1;
            } else if(Math.abs(array[mid] - find) < 1e-9){ // 精度范围内判断相等
                return mid;
            } else {
                last = mid - 1;
            }
            mid = (first + last) / 2;
        }
        return -1; // 循环结束直接返回-1,无需额外判断
    }
}

补充说明

  • 循环结束后first > last是必然结果,无需额外判断,直接返回-1即可。
  • 生成随机double值时,Math.random() * 9999已经是double类型,无需强制转换。

内容的提问来源于stack exchange,提问作者pokemonmater940

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:41:07