Arrays.binarySearch对空数组返回-1,对null数组抛NullPointerException,非法索引抛IllegalArgumentException;需校验非null、索引合法、已排序及对象数组的null与Comparator。

Arrays.binarySearch 对空数组和非法索引的处理非常明确:它不“容忍”错误输入,而是直接抛出异常或返回可预测的负值。关键不是回避问题,而是提前识别边界条件并做针对性防护。
空数组(length == 0)的正确处理
空数组本身不触发异常,但必须满足索引参数合法:
- 若调用 Arrays.binarySearch(new int[0], 42) → 返回 -1(因 low = 0, high = 0,循环不执行,返回 -(0 + 1))
- 若调用带区间的重载,如 Arrays.binarySearch(new int[0], 0, 0, 42) → 合法,同样返回 -1
- 但 Arrays.binarySearch(null, 42) 会立即抛 NullPointerException,必须在调用前判空
非法索引范围的校验与拦截
fromIndex 和 toIndex 的合法性由 JDK 主动检查,失败即抛 IllegalArgumentException:
- fromIndex 或 toIndex > array.length → 抛异常
- fromIndex > toIndex → 明确抛 IllegalArgumentException(源码中有显式判断)
- fromIndex == toIndex 是合法空区间,返回 -(fromIndex + 1),例如 binarySearch(arr, 3, 3, x) 返回 -4
- 建议在传入前做轻量校验:if (fromIndex arr.length || fromIndex > toIndex) { throw new IllegalArgumentException(...); }
未排序数组与 null 元素的风险
binarySearch 不验证数组是否有序,也不过滤 null,结果不可靠:
- 对未排序数组调用 → 返回值无意义,可能为正索引但指向错误元素,也可能漏匹配
- 对象数组(如 String[])含 null 且未提供 Comparator → 运行时抛 NullPointerException
- 解决方式:调用前确保 Arrays.sort(arr) 已执行;对象数组优先使用带 Comparator 的重载,或预过滤 null
安全调用的最小防护模板
一次调用涵盖常见风险点:
- 检查数组非 null
- 校验 fromIndex/toIndex 范围(尤其来自用户输入或计算结果时)
- 确认目标区间已升序(全局排序后可默认成立)
- 对对象数组,避免 null 元素或显式传入非 null 安全的 Comparator

















