Java实现区间数位和最值查询报索引越界异常排查
问题说明
需求为查询指定闭区间[p, r]内数位和等于x的最小整数与最大整数,现有代码无法正常返回最小、最大结果。
给定测试用例信息:
- 输入:p=1, r=55, x=5
- 预期输出:
5 50
需求逻辑:遍历区间内所有整数,筛选数位和(sum of digits)等于x的数值,该测试用例下符合条件的候选值为5、14、23、32、41、50,最终输出候选值中的最小值和最大值即可。
故障现象
编写Java代码实现该需求时,运行抛出index out of bound(索引越界)异常。初步排查怀疑是代码中if(sum==x) list.add(i);语句未正常执行,ArrayList中未存入任何符合条件的元素,导致后续调用list.get()方法取首尾元素时触发异常。
故障代码如下:
import java.util.*; public class wiley{ static void find(int p,int r,int x){ List<Integer> list= new ArrayList<Integer>(); int sum=0,temp,rem; for(int i=p;i<r;i++){ temp=p; while(temp>0){ rem=temp%10; sum+=rem; temp=p/10; } if(sum==x) list.add(i); sum=0; } int l=list.get(0); int m=list.get(list.size()-1); System.out.println(l); System.out.println(m); } public static void main(String args[]){ int p=1; int r=55; int x=5; find(p,r,x); } }
错误原因分析
代码共有4处核心错误,直接导致list始终为空触发越界:
- 数位计算对象错误:for循环内每次给temp赋值为固定值p,而非当前遍历的变量i,导致全程只计算区间左端点p的数位和,从未校验遍历到的i是否符合条件。测试用例中p=1,数位和恒为1,永远不可能等于x=5,因此list不会存入任何元素。
- 数位拆分逻辑错误:while循环内更新temp时写的是
temp=p/10,正确逻辑应为每次将temp自身除以10取整,否则就算temp赋值正确,也只能计算到个位数值,高位数位会被完全遗漏,数位和计算结果错误。 - 区间遍历边界错误:for循环判断条件为
i<r,需求要求查询闭区间[p, r],该写法会直接漏掉右端点r,如果r本身是符合条件的数值会被漏统计。 - 边界场景防御缺失:代码未判断list是否为空就直接调用
get()方法取首尾元素,一旦区间内没有符合条件的数值,会直接抛出索引越界异常。
修正方案
针对上述错误逐一修改即可:
- 将循环内temp的初始赋值从
temp=p改为temp=i,确保每次计算的是当前遍历值的数位和 - 将while循环内的temp更新语句从
temp=p/10改为temp=temp/10,保证逐位拆分所有数位完成求和 - 将for循环条件从
i<r改为i<=r,覆盖闭区间右端点 - 增加空列表判断,无符合结果时给出提示,避免异常崩溃
修正后的可运行代码如下:
import java.util.*; public class wiley{ static void find(int p,int r,int x){ List<Integer> list= new ArrayList<Integer>(); int sum=0,temp,rem; for(int i=p;i<=r;i++){ temp=i; sum = 0; while(temp>0){ rem=temp%10; sum+=rem; temp=temp/10; } if(sum==x) list.add(i); } if (list.isEmpty()) { System.out.println("区间内无符合条件的数"); return; } int l=list.get(0); int m=list.get(list.size()-1); System.out.println(l); System.out.println(m); } public static void main(String args[]){ int p=1; int r=55; int x=5; find(p,r,x); } }
运行修正后代码,可正确输出预期结果5和50。
内容的提问来源于stack exchange,提问作者Rohiit Kadam
相关产品推荐
相关产品推荐

