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

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()方法取首尾元素,一旦区间内没有符合条件的数值,会直接抛出索引越界异常。
修正方案

针对上述错误逐一修改即可:

  1. 将循环内temp的初始赋值从temp=p改为temp=i,确保每次计算的是当前遍历值的数位和
  2. 将while循环内的temp更新语句从temp=p/10改为temp=temp/10,保证逐位拆分所有数位完成求和
  3. 将for循环条件从i<r改为i<=r,覆盖闭区间右端点
  4. 增加空列表判断,无符合结果时给出提示,避免异常崩溃

修正后的可运行代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:15:48